在Java中使用基于匹配的结果替换不同的正则表达式匹配

时间:2013-07-05 11:14:25

标签: java regex

正则表达式的一个常见用法是将匹配项替换为基于匹配项的内容。

例如,带有票号ABC-1234: some text (ABC-1234)的提交文本必须替换为<ABC-1234>: some text (<ABC-1234>)(&lt;&gt;作为某些环境的示例。)

这在Java中非常简单

String message = "ABC-9913 - Bugfix: Some text. (ABC-9913)";
String finalMessage = message;
Matcher matcher = Pattern.compile("ABC-\\d+").matcher(message);
if (matcher.find()) {
  String ticket = matcher.group();
  finalMessage = finalMessage.replace(ticket, "<" + ticket + ">");
}
System.out.println(finalMessage);

结果为<ABC-9913> - Bugfix: Some text. (<ABC-9913>)

但是如果输入String中有不同的匹配,则不同。我尝试使用if (matcher.find()) {替换while (matcher.find()) {稍微不同的代码。结果搞砸了双倍替换(<<ABC-9913>>)。

如何以优雅的方式替换所有匹配的值?

2 个答案:

答案 0 :(得分:2)

您只需使用replaceAll

即可
String input = "ABC-1234: some text (ABC-1234)";
System.out.println(input.replaceAll("ABC-\\d+", "<$0>"));

打印:

<ABC-1234>: some text (<ABC-1234>)

$0是对匹配字符串的引用。

Java regex reference(请参阅“群组和捕获”)。

答案 1 :(得分:0)

问题是replace()方法一遍又一遍地转换字符串。

更好的方法是一次更换一个匹配。 matcher类有一个appendReplacement方法。

String message = "ABC-9913, ABC-9915 - Bugfix: Some text. (ABC-9913,ABC-9915)";
Matcher matcher = Pattern.compile("ABC-\\d+").matcher(message);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
  String ticket = matcher.group();
  matcher.appendReplacement(sb, "<" + ticket + ">");
}
matcher.appendTail(sb);
System.out.println(sb);