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

3

我花了一个小时去追踪我认为不正常的行为,使用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);
}

请注意第二行只有单个反斜杠,而不像第一行那样有两个。

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#replaceAll(java.lang.String)http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#quoteReplacement(java.lang.String) - SLaks
是的,我在看到问题后阅读了文档,并发现了Matcher.quoteReplacement,但这并不能解释为什么这似乎违反了至少对我来说的最小惊讶原则:(。 - nikolavp
2个回答

2

确实需要在String#replaceAll的第一个参数中双倍转义反斜杠。

原因:

这是因为你的替换字符串可以包含反向引用(back-references),例如$1$2等。即使替换文本也会被底层的正则表达式引擎处理,因此需要双倍转义与第一个参数相同,正如你已经发现的那样。


2
正如所提到的,替换字符串使用$字符引用捕获组。
因此,要插入文字$,需要用\进行转义。
您可以在源代码中看到这一点。
我不确定为什么他们没有像.Net那样使用$$

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接