Java正则表达式组替换

6
有没有一种方法可以转换字符串?
"m1, m2, m3"

to the following

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

只能使用String.replaceAll(regex, replacement)方法吗?

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

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
2个回答

5
如果你从另一个角度看待这个问题(确切地说是反过来看!),你会得到一个寻找终止符而不是内容的表达式。这个表达式效果更好:
System.out.println("m1, m2, m3".replaceAll("(\\s*(,|$))", "/build$1"));

这里是在 ideone 上此程序的链接">。


这正是我考虑要做的方式。但是你没有把/build和$1交换吗? - BlackVegetable
1
@BlackVegetable 因为我匹配的是终止符而不是内容,所以 $1 应该放在最后。 - Sergey Kalinichenko
1
不错。但是如果逗号之间有空格,这个解决方案将无法工作。例如,对于输入 'm1 , m2, m3 ',输出将是不正确的:'m1 /build, m2 /build,m3 /build'。第二个答案使用 (\w+) 作为正则表达式可以处理这种情况。 - Michal Vician
1
@miso 虽然这个问题不太重要,但 "逗号前的空格" 很容易解决(请参见编辑)。我更喜欢 \\w+ 的解决方案 :) - Sergey Kalinichenko

4

([^,]*)可以匹配空字符串,甚至可以在两个空格之间匹配。请尝试使用([^,]+)(\w+)

另一个小提示-您可以使用$0引用整个匹配的字符串,避免捕获组:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接