2012-07-13 114 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