2011-02-06 6 views
2
나는 이러한 문자 중 하나를 대체 할

:자바 정규 표현식

% \ , [ ] # & @ !^

... 빈 문자열 ("").

은이 코드를 사용 :

String line = "[ybi-173]"; 
Pattern cleanPattern = Pattern.compile("%|\\|,|[|]|#|&|@|!|^"); 
Matcher matcher = cleanPattern.matcher(line); 
line = matcher.replaceAll(""); 

을하지만 그것은 작동하지 않습니다.

이 정규 표현식에서 무엇을 놓치겠습니까?

+0

'\' –

답변

3

해결책이 작동하지 않는 몇 가지 이유가 있습니다.

일치시키려는 문자 중 일부는 ^, []을 포함하여 정규식에서 특별한 의미를 갖습니다. 이것들은 \ 문자로 이스케이프해야하지만, 더 나쁜 경우에는 \ 그 자체를 이스케이프 처리해야 Java 컴파일러가 \을 정규 표현식 생성자로 전달할 수 있습니다. 따라서 1 단계를 요약하면 ] 문자와 일치 시키려면 Java 문자열이 "\\]"과 같아야합니다.

그러나이 또한 대체 연산자 |이 아닌 문자 클래스 []의 경우입니다. "a, b, c 등의 문자 중 어느 하나라도 일치 시키려면 문자 클래스가 [%\,[]#&@!^]이 되겠지만 자바 문자열 이스케이프 규칙과 특정 문자의 특수 의미로 인해 정규 표현식은 [%\\\\,\\[\\]#&@!\\^]이됩니다. .

+4

사람들은'[% \\\\, \\\ [\\\] # & @! \\ ^] '와 같은 사악한 괴물을 참아내는 것은 믿기지 않습니다. ** ** 더 좋은 방법이 되길 !! – tchrist

+0

나는'^'에 대해서도 같은 생각을하고 있었지만 그것은 문자 클래스의 시작 부분에만 특별한 의미가 있으며 끝에서 벗어날 필요가없는 것 같습니다. –

4

일부 문자는 다르게 해석되는 특수 문자입니다. 당신은 백 슬래시 모두 탈출, 또는 더 나은 아직 문자 클래스에 넣어 없습니다 수 있습니다 (완화, 비 CC의 문자를 이스케이프 할 필요 가독성) : 당신은 문자 그룹으로 당신의 패턴을 정의하는 것

Pattern cleanPattern = Pattern.compile("[%\\\\,\\[\\]#&@!^]"); 
+1

이 아닌 특수 문자를 모두 이스케이프 처리해야 할 수도 있습니다. [] – Ido

+0

때문에 char 클래스에서 리터럴'['및']'을 이스케이프해야하기 때문에 작동하지 않습니다 – codaddict

+0

@codaddict : 감사합니다. – BoltClock

0

[]으로 묶고 특수 문자를 이스케이프 처리합니다 (예 :

String n = "%\\,[]#&@!^".replaceAll("[%\\\\,\\[\\]#&@!^]", "");