2011-09-19 3 views
3

문자열이 아닌 문자를 제외한 모든 문자를 제거하는 자바 프로그램이 있습니다 (예 : =) 또는 =] 또는 : P정규식을 사용하여 단어가 아닌 문자를 일치 시키십시오. 웃는 얼굴이 아닙니다.

반의어를 [a-zA-Z ]|=\)|=\]|:P과 일치시키는 것은 매우 쉽지만이 표현식을 무효화하는 방법을 알 수는 없습니다. String.replaceAll() 함수를 사용하고 있기 때문에 형식이 부정되어야합니다.

미소의 길이는 일반적으로 2 자이며 한 번에 한 글자와 만 일치한다는 사실 때문에 문제가 발생할 수 있다고 생각합니까?

흥미롭게도 replaceAll("(?![Tt])[Oo]","")은 단어 "to"에서 문자 O의 모든 발생을 제거합니다. 이것은 replaceAll 함수가 정규식 lookahead를 이해하지 못함을 의미합니까? 내가 매우 지저분하지만 완벽하게 작동

replaceAll("(?<![=:;])[\\]\\[\\(\\)\\/]","") 
.replaceAll("[=:;](?![\\]\\[\\(\\)o0OpPxX\\/])","") 
.replaceAll("[^a-zA-Z=:;\\(\\)\\[\\]\\/ ]","") 

를 사용하여 종료

... 오류가 발생하지 않습니다. The... quick! (brown) fox jump's over the[] lazy dog. :] =O ;XTHE QUICK BROWN FOX JUMPS OVER THE LAZY DOG :] =O ;X

편집 : 수정 사항을 무시하고 아래에서 허용되는 대답을 참조하십시오.

+1

재미있는! :-) 및> : ^}는 2 자 이상입니다. :) – TrueWill

+0

트롤입니까? 나는 "일반적으로"라는 단어를 포함 시켰습니다. –

+0

TrueWill의 진술은 저에게 사실이 아닌 트롤 같은 것처럼 보입니다. –

답변

4

네거티브 미리보기를 사용하면이 문제를 매우 쉽게 처리 할 수 ​​있습니다. 기본적으로 일치는 (?!...) 그룹의 정규식이 일치하는 위치에서 실패합니다. lookahead가 일치하지 않으면 문자를 소비하는 단일 와일드 카드 (.)로 음수 미리보기를 따라야합니다. 즉, 다음 문자가 웃는 ​​얼굴의 일부가 아닌 문자가 아닌 문자임을 의미합니다.

편집 :

(?![a-zA-Z ]|=\)|=\]|:P).(?<!=\)|=\]|:P) 
:
은 분명히 난 당신이 또한 당신이 소비되는 문자가 웃는에서 두 번째 문자가 아니라는 것을 확인하기 위해 .을 다음과 같은 부정적인 lookbehind을 필요로 매우 철저하게 내 원래 정규식을 테스트하지 않았 당신은 예를 들어, 눈과 입 문자 클래스를 사용하여 정규식을 단축 할 수있을 것으로

참고 :

[:=][\(\)\[\]] 
^ ^-----mouth 
    |--eyes 
+0

'테스트. =] =) : P는 실패하지 않습니다! ' 'Testing = = : P dont fail'이됩니다. –

+0

또한 괄호 (? ((a-zA-Z) | = \) | = \] | : P))의 추가 세트로 시도했습니다. 여전히 작동하지 않습니다. –

+0

흥미롭게도 replaceAll ("(?! [Tt]) [Oo]", "")은 단어 "to"에서 문자 O의 모든 항목을 제거합니다. 이것은 replaceAll 함수가 정규식 lookahead를 이해하지 못함을 의미합니까? 어떤 오류도 발생시키지 않습니다. –

관련 문제