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

标签 java regex

我有一个字符串 s 和一个正则表达式。我想用替换字符串替换 s 中正则表达式的每个匹配项。替换字符串可能包含一个或多个反斜杠。为了执行替换,我使用了 MatcherappendReplacement方法。

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/

相关文章:

java - 尝试通过同一个套接字发送文件和字符串(在 Java 中)

regex - 尝试使用 BASH 删除段落中的重复项

javascript - 正则表达式匹配两个或多个不连续的相同字符

python - 匹配 uuid.uuid4().hex 生成的值的正确正则表达式是什么?

python - 在python中使用正则表达式来搜索 float ,并用字符串中降低的 float 替换它们?

java - Selenium WebDriver (JAVA) 中 gmail 帐户的电子邮件验证

java - Spring Boot 自定义登录 : "login", 模板可能不存在,或者可能无法被任何配置的模板解析器访问

java - 用下一个替换元音不起作用

c# - 如何从 C# 程序员的角度为 Java 评估做准备?

php - 正则表达式可选组和数字长度