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”)代码>也出现在我的回答之后