为什么在Java正则表达式中查找“+”符号需要两个斜杠?

13

有一些内容我不完全理解其含义。我知道如果想在正则表达式中找到特殊字符,需要对它们进行转义。我还在某处看到过,如果反斜杠在Java的字符串字面量内部,需要对其进行转义。我的问题是,如果我“转义”反斜杠,它的意义不就消失了吗?这样它就无法转义后面的加号符号了吧?

会抛出一个错误(但既然这是转义这些特殊字符的方式,为什么会报错呢?):

replaceAll("\+\s", ""));

作品:

replaceAll("\\+\\s", ""));

希望这样讲得通。我只是试图理解为什么需要加这些额外的斜杠,而我阅读的正则表达式教程并没有提到它们。而像"\+"这样的东西应该能够找到加号符号。


请注意,在任何上下文中使用"\+\s"都会导致错误,例如String s = "\+\s";。在replaceAll参数中使用字符串字面值没有什么特别的。 - ajb
1
为了让我们都保持警觉,SO使用的格式化软件使用反斜杠来使特殊字符变得不再特殊。这就是为什么我不得不添加反引号来使你问题中最后一行的反斜杠可见 ("\+")。 - Alan Moore
2个回答

22
这里有两种“转义”情况。第一个反斜杠用于Java语言中转义第二个反斜杠,以创建一个实际的反斜杠字符。反斜杠字符是用于解释正则表达式引擎中的+s的转义符。这就是为什么需要两个反斜杠--一个用于Java,一个用于正则表达式引擎。只有一个反斜杠,Java会报告\s\+作为非法转义字符--不是针对正则表达式,而是针对Java语言中的实际字符。

4
@DoubleElite,为了阐明rgettman所说的内容,请将以下代码放入您的程序中并观察它打印出来的结果:System.out.println("\\+\\s"); - Solomon Slow

1

额外斜杠的原因是,第一个斜杠“\”是字符串的转义符,第二个斜杠“\”是正则表达式的转义符。


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