2012-07-13 116 views
6

有没有办法只能通过String.replaceAll(regex, replacement)方法来转换字符串Java的正则表达式替换组

"m1, m2, m3" 

以下

"m1/build, m2/build, m3/build" 

到目前为止,这是我最好的尝试:

System.out.println("m1, m2, m3".replaceAll("([^,]*)", "$1/build")); 
>>> m1/build/build, m2/build/build, m3/build/build 

正如你可以看到输出是不正确。但是,使用Linux中的sed命令相同的正则表达式给出了正确的输出:

echo 'm1, m2, m3' | sed -e 's%\([^,]*\)%\1/build%g' 
>>> m1/build, m2/build, m3/build 

回答

4

([^,]*)可以匹配空字符串,它甚至可以两个空间之间的匹配。尝试([^,]+)(\w+)

另一个小记 - 您可以使用$0指整个匹配的字符串,避免了拍摄组:(!毫不夸张)

System.out.println("m1, m2, m3".replaceAll("\\w+", "$0/build")); 
+0

+1是的,这似乎是问题:http://ideone.com/omXQF – mellamokb 2012-07-13 20:43:27

5

如果你看问题从另一端你会得到一个表达式寻找终结者,而不是内容。这个表达式的工作好了很多:

System.out.println("m1, m2, m3".replaceAll("(\\s*(,|$))", "/build$1")); 

这里是a link to this program on ideone

+0

这就是我正在考虑这样做的方式。但是你没有/ build和$ 1交换? – BlackVegetable 2012-07-13 20:42:13

+1

@BlackVegetable由于我匹配终结符,而不是内容,'$ 1'属于最后。 – dasblinkenlight 2012-07-13 20:43:26

+0

呵呵,很高兴知道!谢谢你澄清。 +1 – BlackVegetable 2012-07-13 20:47:59