正则表达式的一个常见用法是将匹配项替换为基于匹配项的内容。
例如,带有票号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>>
)。
如何以优雅的方式替换所有匹配的值?
答案 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);