我有一个字符串 s
和一个正则表达式。我想用替换字符串替换 s
中正则表达式的每个匹配项。替换字符串可能包含一个或多个反斜杠。为了执行替换,我使用了 Matcher
的 appendReplacement方法。
appendReplacement
的问题是它忽略了它在替换字符串中遇到的所有反斜杠。因此,如果我尝试用替换字符串 "a\\b"
替换字符串 "one match"
中的子字符串 "match"
,那么appendReplacement
导致 "one ab"
而不是 "one a\\b"
*:
Matcher matcher = Pattern.compile("match").matcher("one match");
StringBuffer sb = new StringBuffer();
matcher.find();
matcher.appendReplacement(sb, "a\\b");
System.out.println(sb); // one ab
我查看了 appendReplacement
的代码,发现它跳过了任何遇到的反斜杠:
if (nextChar == '\\') {
cursor++
nextChar = replacement.charAt(cursor);
...
}
如何用包含反斜杠的替换字符串替换每个匹配项?
(*) - 请注意,"a\\b"
中只有一个反斜杠,而不是两个。反斜杠刚刚被转义。
最佳答案
您需要双重转义反斜杠,即:
matcher.appendReplacement(sb, "a\\\\b");
完整代码:
Matcher matcher = Pattern.compile("match").matcher("one match");
sb = new StringBuffer();
matcher.find();
matcher.appendReplacement(sb, "a\\\\b");
System.out.println(sb); //-> one a/b
原因是 Java 允许您在替换字符串中使用像 $1
、$2
等反向引用,并且它强制执行与主正则表达式中相同的反斜杠转义机制。
关于java - Matcher 的 appendReplacement 方法忽略替换的反斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27379046/