3

我刚刚浪费了 1 个小时来跟踪我认为replaceAll/replaceFirst在 String 类中不正常的行为。

如果替换字符串中有反斜杠,则替换时将其删除。然后我读到你可以用它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);
}

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

4

2 回答 2

2

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

因此,要插入文字$,您需要使用\.

您可以在源代码中看到这一点。

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

于 2013-10-23T14:01:11.417 回答
2

是的,确实需要将反斜杠作为String#replaceAll.

原因:

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

于 2013-10-23T13:48:51.090 回答