我试图使用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并不认为替换文本是替换它的候选者,而是快速地向前跳过。
对此有一个简单的解决方法吗?
答案 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)", "");