2012-07-13 10 views
6

を交換のみString.replaceAll(regex, replacement)法を用いて、以下のJavaの正規表現のグループ

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

に文字列

"m1, m2, m3" 

を変換するための方法がありますか?あなたは出力が間違っている見ることができるように

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

5

あなたはもう一方の端(!文字通り)から問題を見ればあなたが得ますコンテンツではなくターミネータを探す式。この表現はもっと良く機能しました:

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

ここはa link to this program on ideoneです。

+0

それは私がそれをやっていると思っていた方法です。しかし、/ buildと$ 1を入れ替えていないのですか? – BlackVegetable

+1

@BlackVegetable私は、コンテンツではなくターミネータにマッチしているので、 '$ 1'は最後にあります。 – dasblinkenlight

+0

うわー、知っておいてよかった!明確にしていただきありがとうございます。 +1 – BlackVegetable