2016-11-08 4 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

String에서 문자를 제거하는 것은 매우 끔찍한 방법입니다. 그리고 그것은 작동하지 않습니다. 문자열 ",, + a"를 사용해보십시오. "+"는 제거되지 않습니다. 일반적으로 StringBuilder에 새 String을 만들지 만, 이렇게하는 경우에도 '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의 코드와 일치하기 때문에 명시 적 범위를 제안했습니다. –