正则表达式的一种常见用法是用基于匹配的东西替换匹配。
例如,带有票号的提交文本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>>
)。
如何以优雅的方式替换所有匹配的值?