String.replaceAll不适用于任何种类的字符

问题描述:

所以我得到的是这种简单的方法,它应该删除字符串中除大写和小写字母和数字外的所有字符。String.replaceAll不适用于任何种类的字符

public static String toSimple(String arg) //redurziert einen String auf Buchstaben und ganze Zahlen 
{ 
    String string = arg; 
    int i = 0; 
    while (i < string.length()) 
    { 
     if (((int)string.charAt(i) >= 48 && (int)string.charAt(i) <= 57)||((int)string.charAt(i) >= 65 && (int)string.charAt(i) <= 90)||((int)string.charAt(i) >= 97 && (int)string.charAt(i) <= 121)) 
      i+=1; 
     else 
     { 
      int a = string.length(); 
      string = string.replaceAll(""+string.charAt(i), ""); 

      if (!(string.length() < a)) //Just in case 
      { 
       i+=1; 
      } 
     } 

的问题是,在某些情况下,虽然达到并给出一个字符string.replaceAll不会改变任何东西。我在调试器中检查了它,并找不到任何明显的错误或异常。我没有检查整个ASCII表,我知道这个问题会发生在'$''?'和'。'。 任何建议如何解决?

+0

注意字符文字可用于代替“幻数” - 所以'(int)string.charAt(i)> = 48'可以写成'string.charAt(i)> ='0'',这使得它更加明显。 (在任何情况下都不需要强制转换为int)。 –

+0

这是从字符串中删除字符的一种非常糟糕的方式。它不起作用。试试字符串“,,, + a” - 它不会删除“+”。通常你会在StringBuilder中建立一个新的字符串,但即使你这样做,你也会使用'String.substring'两次来获取字符串前后的字符串。 –

String.replaceAll将正则表达式作为其第一个参数。

$,?.regular expressions中的特殊字符。

改为使用String.replace - 这实际上也是在内部使用正则表达式,但它正确地转义了字符串。


然而,由于您使用String.replaceAll,你可以使用正则表达式做这件事:

return arg.replaceAll("[^A-Za-z0-9]", ""); 
+0

男人,这很容易':D谢谢 –

+1

或'arg.replaceAll(“\\ P {Alnum} +”,“”)' –

+0

@Wiktor确实。我建议明确的范围,因为它符合OP的代码。 –