我刚刚浪费了 1 小时来跟踪我认为不正常的行为
在 String 类中使用 replaceAll/replaceFirst
。
如果替换字符串中有反斜杠,那么它们将被删除
更换。然后我读到你可以使用 Matcher.quoteReplacement(String)
来
创建一个适当的替换字符串,但我的问题是为什么?我可以期待
如果你不这样做,第一个参数应该使用 Patter.quote(String)
进行转义
想要特殊含义,但我看不出有理由更改替换:(
是的 我将开始使用 replace(CharSequence,CharSequence),只是想知道为什么 :)
这是一个清楚地显示“奇怪”行为的示例:
public static void main(String[] args) {
String out = "\\\\test\\\\";
System.out.println(out);
String result = "a".replaceAll("a", out);
System.out.println(result);
}
注意第二行只有一个反斜杠,而不是像第一行那样有两个反斜杠
最佳答案
是的,确实需要将反斜杠作为 String#replaceAll
中的第一个参数进行双重转义。
原因:
这是因为您的替换字符串可以包含 back-references
,例如 $1
、$2
等,甚至替换文本也会被处理通过底层 regex 引擎
因此需要与第一个参数一样进行双重转义,正如您也发现的那样。
关于Java 字符串正则表达式替换方法从替换中删除反斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19543471/