Java 匹配器';Appends替换方法忽略替换';反斜杠

Java 匹配器';Appends替换方法忽略替换';反斜杠,java,regex,Java,Regex,我有一个字符串s和一个正则表达式。我想用替换字符串替换s中正则表达式的每个匹配项。替换字符串可能包含一个或多个反斜杠。为了执行替换,我使用了Matcher的方法 appendReplacement的问题是它忽略了在替换字符串中遇到的所有反斜杠。因此,如果我尝试用替换字符串“a\\b”替换字符串“one match”中的子字符串“match”,那么appendReplacement将导致“one ab”而不是“one a\\b”*: 我查看了appendReplacement的代码,发现它跳过了遇

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

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

我查看了
appendReplacement
的代码,发现它跳过了遇到的任何反斜杠:

if (nextChar == '\\') {
    cursor++
    nextChar = replacement.charAt(cursor);
    ...
}
如何用包含反斜杠的替换字符串替换每个匹配项


(*)-请注意,
“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 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

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

matcher.appendReplacement(sb, "a\\\\b");
完整代码:

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

如果替换字符串应按字面处理,请使用
匹配器。它转义所有
\
字符,也转义
$
字符

String replacement= "a\\b" 
matcher.appendReplacement(sb, Matcher.quoteReplacement(replacement));    

vks:vks:如果你问我的示例替换字符串是否是
“a”+“\”+“b”
,那么是的,除了
“\”
是非法的Java字符串,因为你必须避开反斜杠。我实际上是问替换是否有效:仅供参考,最初的答案只有
replace
code,但现在
matcher.appendReplacement(sb,“a\\\\b”)也出现在我的回答之后