2014-05-22 6 views
3

String.replaceAll을 사용하여 문자열의 일부 공백을 잘라내려고합니다. 그러나 정규 표현식 패턴의 여러 동시 인스턴스가 문자열에 나타나면 모든 두 번째 인스턴스 만 교체됩니다.Java String.replaceAll이 동시 반복 시퀀스를 대체하지 않음

아주 간단한 예 : 내가보고 싶은

String theString = "foo x x x x x bar";   
String trimmed = theString.replaceAll("x\\s*x", "xx");   
System.out.println(theString); 
System.out.println(trimmed); 

:

foo x x x x x bar 
foo xxxxx bar 

내가 볼 무엇 :

foo x x x x x bar 
foo xx xx x bar 

완전히 대체하기는 대체 텍스트를 고려하지 않는 것 같다 대신 자신을 대체하기위한 후보로, 대신에 기분 좋게 건너 뜁니다.

쉽게 해결할 수 있습니까?

+1

* "대체 텍스트를 대체 문자로 간주하지 않습니다. 그 자체가 바뀌었고 그 대신에 기분 좋게 앞으로 건너 뜁니다. "* 올바른, 모든 문자열 대체 방법에 대한 ** 매우 ** 비정상적인 동작입니다. –

답변

5

문제는 공간 뒤의 x과 일치한다는 것입니다. 따라서 첫 번째 경기가 끝나면

foo x x x x x bar 
    ^
     |---- HERE 

당신은 그것을 삼키고 싶지 않습니다. 이 수와 일치하지 않는,

.replaceAll("(?<=x)\\s+(?=x)", ""); 

합니다 (* 정량이 +으로 대체되었습니다 참고 :

.replaceAll("x\\s+(?=x)", "x"); 

당신은 심지어 내다과 lookbehind 모두 갈 수있다 : 당신은 내다을 사용해야합니다 공백 문자가없는 경우 대체 할 필요가 없습니다.)

+0

'\\ s +'에 좋은 캐치 – gtgaxiola

+0

우수하고, 내가 찾고있는 것이고, 분명하게 설명했다. 많은 감사합니다. – Rogerborg

+0

어울리는 답을 수락하는 것을 잊지 마세요;) – fge

-1
theString.replaceAll("(?<=x)\\s+(?=x)", ""); 
+0

downvotes에 대한 설명은 무엇입니까? –