首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Matcher的appendReplacement方法忽略了替换的反斜杠

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

Stack Overflow用户
提问于 2014-12-09 12:32:03
回答 2查看 571关注 0票数 5

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

appendReplacement的问题是它忽略了它在替换字符串中遇到的所有反斜杠。因此,如果我尝试用替换字符串"match"替换字符串"one match"中的子字符串"a\\b",那么appendReplacement将导致"one ab"而不是"one a\\b"*。

代码语言:javascript
运行
复制
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的代码,发现它跳过了任何遇到的反斜杠:

代码语言:javascript
运行
复制
if (nextChar == '\\') {
    cursor++
    nextChar = replacement.charAt(cursor);
    ...
}

如何用包含反斜杠的替换字符串替换每个匹配?

(*) -注意,"a\\b"中有一个反斜杠,而不是两个。反斜杠刚刚逃脱。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-09 12:37:28

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

代码语言:javascript
运行
复制
matcher.appendReplacement(sb, "a\\\\b");

完整代码:

代码语言:javascript
运行
复制
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等),并且对反斜杠强制执行与主正则表达式相同的转义机制。

票数 2
EN

Stack Overflow用户

发布于 2020-11-15 21:33:00

如果应该按字面处理替换字符串,请使用Matcher.quoteReplacement。它转义所有\字符和$字符。

代码语言:javascript
运行
复制
String replacement= "a\\b" 
matcher.appendReplacement(sb, Matcher.quoteReplacement(replacement));    
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27379046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档