Matcher的appendReplacement方法忽略替换的反斜杠

sna*_*ile 5 java regex

我有一个字符串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",而不是两个.反斜杠刚刚被转义.

anu*_*ava 2

您需要双重转义反斜杠,即:

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并且对反斜杠强制执行与主正则表达式相同的转义机制。