我有一个字符串s
和一个正则表达式.我想s
用替换字符串替换正则表达式的每个匹配.替换字符串可能包含一个或多个反斜杠.要执行替换,我使用Matcher
的是appendReplacement方法.
问题appendReplacement
是它忽略了它在替换字符串中遇到的所有反冲.因此,如果我尝试用替换字符串替换字符串"match"
中的子"one match"
字符串"a\\b"
,则会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
Run Code Online (Sandbox Code Playgroud)
我看了一下appendReplacement
代码,发现它跳过任何遇到的反斜杠:
if (nextChar == '\\') {
cursor++
nextChar = replacement.charAt(cursor);
...
}
Run Code Online (Sandbox Code Playgroud)
如何用包含反斜杠的替换字符串替换每个匹配?
(*) - 请注意,只有一个反斜杠"a\\b"
,而不是两个.反斜杠刚刚被转义.
您需要双重转义反斜杠,即:
matcher.appendReplacement(sb, "a\\\\b");
Run Code Online (Sandbox Code Playgroud)
完整代码:
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
Run Code Online (Sandbox Code Playgroud)
原因是 Java 允许您在替换字符串中使用诸如 等反向引用$1
,$2
并且对反斜杠强制执行与主正则表达式相同的转义机制。