0

正则表达式的一种常见用法是用基于匹配的东西替换匹配。

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

这在 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>)

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

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

4

2 回答 2

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 正则表达式参考(请参阅“组和捕获”)。

于 2013-07-05T11:18:28.697 回答
1

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

更好的方法是一次替换一个匹配项。匹配器类对此有一个 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);
于 2013-07-05T11:14:25.440 回答