gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:11:10 27 4
gpt4 key购买 nike

我有一个字符串 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com