我在句子“你是测试”中匹配一个字符串“test”的模式,并用“test”替换它。
StringBuffer sb = new StringBuffer();
Pattern pattern = Pattern.compile("test", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("you are test");
while (matcher.find()) {
matcher.appendReplacement(sb, "test\"));
}
matcher.appendTail(sb);
replacementString = sb.toString();
问题出在matcher.appendReplacement(sb, "test\"));
声明中,其中“\”被视为特殊字符,未执行替换。
请分享您对如何克服此方案以及如何使用字符串中的“\”替换您的想法。
答案 0 :(得分:6)
要将\
放在java中的字符串文字中,您必须将其作为\\
转义。
但它有点复杂。请参阅javadoc:
请注意替换中的反斜杠(
\
)和美元符号($) 字符串可能会导致结果与正确的结果不同 作为文字替换字符串处理。可以对待美元符号 作为对如上所述的捕获的子序列的引用,和 反斜杠用于替换替换中的文字字符 字符串。
所以你必须双重逃避:
matcher.appendReplacement(sb, "test\\\\"));
答案 1 :(得分:0)
为什么要使用所有这些代码行,当一行代码执行相同操作时:
String s = input.replaceAll("test", "$0\\\\");
注意使用$0
来反向引用整个匹配,并使用双倍反斜杠来创建一个文字正则表达式反斜杠。