【发布时间】:2014-12-09 12:32:03
【问题描述】:
我有一个字符串s 和一个正则表达式。我想用替换字符串替换 s 中正则表达式的每个匹配项。替换字符串可能包含一个或多个反斜杠。为了执行替换,我使用了Matcher 的appendReplacement 方法。
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" 中有一个反斜杠,而不是两个。反斜杠只是被转义了。
【问题讨论】:
-
"a"+"\"+"b"???????? -
@vks:如果您要问我的示例替换字符串是否为
"a"+"\"+"b",那么是的,除了"\"是非法Java 字符串,因为您必须转义反斜杠。 -
我实际上是在问这种替换是否有效:P