Java字符串正则表达式替换方法从替换中删除反斜杠 我只是浪费了1个小时来追踪我认为不正常的行为。 使用字符串类中的replaceAll/replaceFirst

Java字符串正则表达式替换方法从替换中删除反斜杠 我只是浪费了1个小时来追踪我认为不正常的行为。 使用字符串类中的replaceAll/replaceFirst,java,regex,string,Java,Regex,String,如果替换字符串中有反斜杠,则在 替换。然后我读到,您可以使用Matcher.quoteReplacement(String)来 创建一个合适的替换字符串,但我的问题是为什么?我可以预料到 如果没有,第一个参数应该用Patter.quote(String)转义 想要特殊含义,但我不认为有理由更改替换:( 是我将开始使用replace(CharSequence,CharSequence),只是想知道为什么:) 下面的示例清楚地显示了“奇怪”的行为: public static void main(S

如果替换字符串中有反斜杠,则在 替换。然后我读到,您可以使用
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
中的第一个参数双重转义

原因:


这是因为替换字符串可以包含
反向引用
,如
$1
$2
等,甚至替换文本也由底层的
正则表达式引擎处理
,因此需要与第一个参数相同的双转义,正如您已经发现的那样。

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

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

你可以在地图上看到这一点


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

是的,我在看到问题后阅读了文档,发现了关于Matcher.quoteReplacement的内容,但这并不能解释这似乎至少对我不利的事实:(