24

线

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()方法是将点 ( \\.) 替换为 ( \\\\)。

有人可以解释一下吗?

4

7 回答 7

26

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

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

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

于 2012-06-02T20:38:00.937 回答
19

replaceAll的 javadoc说:

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

于 2012-06-02T20:38:38.683 回答
6

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

String trickyString = "$Ha!I'm tricky|.|";
String safeToUseInReplaceAllString = Pattern.quote(trickyString);
于 2014-09-30T04:04:07.580 回答
4

这是我评论的格式化附录

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

s = s.replaceAll("\\.", "\\\\\\");
于 2013-10-02T10:20:52.690 回答
0

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

于 2012-06-02T20:49:08.017 回答
0

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

使用全部替换:

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

使用替换:

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

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

于 2014-12-13T00:50:43.087 回答
0

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

String prefix = role.replaceFirst("(\\.).*", "");

所以你得到前缀 = THIS;

于 2018-06-21T17:47:41.257 回答