2016-11-08 6 views
-2

Так что у меня есть этот простой метод, который должен удалить все символы, кроме букв и цифр в верхнем и нижнем регистре из строки.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» - она ​​не удалит «+». Обычно вы строили бы новую String в StringBuilder, но даже если бы вы делали это так, вы бы использовали 'String.substring' дважды, чтобы получить строку до и после символа. –

ответ

2

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. –