【问题标题】:Java String regex replace methods remove backslashes from replacementJava String 正则表达式替换方法从替换中删除反斜杠
【发布时间】:2013-10-23 13:46:14
【问题描述】:

我刚刚浪费了 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);
}

注意第二行只有一个反斜杠,而不是第一行的两个反斜杠

【问题讨论】:

标签: java regex string


【解决方案1】:

是的,确实需要将反斜杠作为String#replaceAll 中的第一个参数进行双重转义。

原因:

这是因为您的替换字符串可以包含back-references,例如$1$2 等,即使替换文本也由底层regex engine 处理,因此需要与第一个参数相同的双重转义,你也发现了。

【讨论】:

    【解决方案2】:

    如前所述,替换字符串使用$ 字符来引用捕获组。

    因此,要插入文字 $,您需要使用 \ 对其进行转义。

    你可以在source看到这个。

    我不确定他们为什么不像 .Net 那样使用 $$

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多