2010-07-28 2 views
1

이런 어리석은 질문을하는 것이 싫지만 내 코드가 내가 예상 한대로 작동하지 않는 이유는 무엇입니까?Java 정규식 혼동

주요 방법

자바 코드 :

String s = "\"The fat-dog [ruffus] @nd the stupid-cat [*mewzer*] don't like each other!\""; 
String[] tokens = s.replaceAll("[\\x27]+", "").replaceAll("[^a-zA-z_\\x2D]+", " ").replaceAll("\\s+", " ").trim().split(" "); 

System.out.println(s); 
for (String t : tokens) 
    System.out.println("Token: " + t); 

이 인쇄 :

"지방-개 [ruffus] @nd 바보 고양이 [mewzer] 좋아하지 않는다 서로!"

Token: The 
Token: fat-dog 
Token: [ruffus] 
Token: nd 
Token: the 
Token: stupid-cat 
Token: [ 
Token: mewzer 
Token: ] 
Token: dont 
Token: like 
Token: each 
Token: other 
그 빌어 먹을 괄호를 제외하고, 대부분 정확

! 그들은 "[^a-zA-z_\\x2D]+" 표현으로 대체되어서는 안됩니까? 심지어 replaceAll("\\[\\]"," ")을 추가 한 다음 replaceAll("\\x5B\\x5D"," ")을 추가하려고 시도했습니다.


어떻게 이러한 대괄호를 제거 할 수 있습니까? 방금 언급 한 모든 진술을 바꿀 수있는 방안은 무엇입니까?

답변

2

의 문자는 실제로 서구 유럽/북미 지역에 [와]를 포함합니다. [\] ^`_는 Z와 a 사이에 놓여집니다. 보통 A-z이라고 쓰면 편리하지만 함정도 있습니다!

당신은 아마 Z A- 을 의미

+1

아, 미묘한 대문자 표기법. 때로는 눈을 이해하는 두 번째 정규식 쌍이 필요합니다. 감사. – Doug

1

이 :

replaceAll("\\[\\]"," ") 

아마해야합니다

replaceAll("(\\[|\\])"," ") 

당신은 대신 [ 또는 ]을 대체하는하는 []의 인스턴스를 교체하고있었습니다. 첫 번째 시도가 때문에

완전히 대체 ("[^ A-Z zA- _ \ 내지 X2d] +", "")

이 범위 작동하지

+0

감사합니다. 이것이 두 번째 두 개의 replaceAll식이 예상대로 작동하지 않는 이유를 설명하지만 첫 번째 식은 어떨까요? '['과']'는'a-zA-z _ \\ x2D' 집합에 맞지 않습니까? – Doug

+1

[및] 세트 A-z, 내 대답 참조 :) – Affe

0

() 하이픈 제외 (문자열에서 모든 단어가 아닌 문자를 제거) 당신이 정말하고 싶은 것 같다 무엇을 할 수있는 더 좋은 방법이 같습니다 :

String[] tokens = s.replaceAll("[^\\w\\s-]+", "").replaceAll("\\s+", " ").trim().split(" "); 

이렇게하면 문자열에 숫자가 남게됩니다. 그게 문제 야?