字符串的 replaceAll() 方法和转义字符

2022-09-01 20:08:45

生产线

System.out.println("\\");

打印单个反斜杠 ()。和\

System.out.println("\\\\");

打印双反斜杠 ()。理解!\\

但为什么在下面的代码中:

class ReplaceTest
{
    public static void main(String[] args)
    {
        String s = "hello.world";
        s = s.replaceAll("\\.", "\\\\");
        System.out.println(s);
    }
}

是输出:

hello\world

而不是

hello\\world

毕竟,该方法是将点 () 替换为 ()。replaceAll()\\.\\\\

有人可以解释一下吗?


答案 1

使用正则表达式替换字符时,可以使用反向引用,例如替换使用匹配项中的分组。\1

但是,这意味着反斜杠是一个特殊字符,因此,如果您确实要使用反斜杠,则需要对其进行转义。

这意味着在Java字符串中使用它时,它实际上需要转义两次。(首先用于字符串解析器,然后用于正则表达式解析器。


答案 2

replaceAll 的 javadoc 说:

请注意,替换字符串中的反斜杠 ( \ ) 和美元符号 ($) 可能会导致结果与将其视为文字替换字符串时的结果不同;请参阅 Matcher.replaceAll。如果需要,请使用 Matcher.quoteReplacement(java.lang.String) 来禁止显示这些字符的特殊含义。