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

时间:2012-06-02 20:31:30

标签: java regex string

该行

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()方法正在用(\\.)替换点(\\\\)。

有人可以解释一下吗?

7 个答案:

答案 0 :(得分:23)

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

然而,这意味着反斜杠是一个特殊字符,所以如果你真的想要使用反斜杠,则需要对其进行转义。

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

答案 1 :(得分:14)

replaceAll的javadoc说:

  

请注意替换中的反斜杠(\)和美元符号($)   字符串可能会导致结果与正确的结果不同   被视为字面替换字符串;见Matcher.replaceAll。 使用   Matcher.quoteReplacement(java.lang.String)来压制特殊   如果需要,这些字符的含义。

答案 2 :(得分:5)

如果您不需要正则表达式进行替换,只需要替换完整的字符串,请在替换之前转义正则表达式控制字符

String trickyString = "$Ha!I'm tricky|.|";
String safeToUseInReplaceAllString = Pattern.quote(trickyString);

答案 3 :(得分:3)

这是我的评论的格式化附录

s = s.replaceAll("\\.", Matcher.quoteReplacement("\\"));  

更具有可读性和意义

s = s.replaceAll("\\.", "\\\\\\");

答案 4 :(得分:0)

反斜杠是Java Strings中的转义字符。例如反斜杠在Java中具有预定义。您必须使用“\ \”来定义单个反斜杠。如果要定义“\ w”,则必须在正则表达式中使用“\ \ w”。如果你想使用反斜杠作为文字,你必须输入\ \ \ \,因为\也是正则表达式中的转义字符。

答案 5 :(得分:0)

我相信在这种特殊情况下,更容易使用替换而不是替换所有。 Gonzo牧师在谈到逃避角色时有正确的答案。

使用replaceAll:

s = s.replaceAll("\\.", "\\\\\\\\");

使用替换:

s = s.replaceAll(".", "\\");

replace只需要一个匹配的字符串,而不是一个正则表达式。

答案 6 :(得分:0)

我不喜欢这种正则表达式的实现。我们应该能够使用单个'\'而不是'\'来转义字符。但是无论如何,如果您想获得THIS.Out_Of_That可以这样做:

$nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Wed_Apr_11_23:16:29_CDT_2018
Cuda compilation tools, release 9.2, V9.2.88

所以您得到前缀= THIS;