Java String.replaceAll不替换并发重复序列

时间:2014-05-22 16:43:07

标签: java regex string replaceall

我试图使用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

似乎replaceAll并不认为替换文本是替换它的候选者,而是快速地向前跳过。

对此有一个简单的解决方法吗?

2 个答案:

答案 0 :(得分:5)

问题是你在空格后匹配x;因此,在您的第一场比赛后,您匹配:

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

你不想吞下它;你必须使用前瞻:

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

你甚至可以同时使用前瞻和后视:

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

(请注意,*量词已替换为+;它允许不匹配没有空格字符的位置,在这种情况下您无论如何都不想替换)

答案 1 :(得分:-1)

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