Java 字符串正则表达式替换方法从替换中删除反斜杠

标签 java regex string

我刚刚浪费了 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/

相关文章:

java - 如何让 Apache Commons Net 在 Android 中工作? - java.lang.NullPointerException 错误

java - 如何在java中对复杂集合mongodb中的列表进行排序和获取?

ruby - 如何在 ruby​​ 中使用正则表达式和 .sub 覆盖 txt 文件中的部分行

javascript - 子文件夹中图像的工作箱路由

带有锁定 jar 的 Java classLoader 困境

python - 如何在 Python 中使用 NLTK 仅将具有以下模式 <NN>*<PRP> *"run in"<NN> 的句子分块?

regex - Lua:子字符串

c - 使用gets读取二维字符串

android - 如何在android中的句子中间更改文本颜色

java - 服务器环境上的 Guava AbstractScheduledService