为什么String.replaceAll()需要这么多的转义为“字符?

时间:2013-01-17 21:09:26

标签: java regex

如果我有字符串a"b"c",但我想获得a\"b\"c\",我自然会写

String t = "a\"b\"c\"";
t = t.replaceAll("\"", "\\\"");

但是,这会产生相同的字符串a"b"c"。正确的方法是

t.replaceAll("\"", "\\\\\"");

为什么?

1 个答案:

答案 0 :(得分:7)

replaceAll对模式和替换使用正则表达式 - 两者都需要转义反斜杠。因此,第二个参数所需的正则表达式替换模式是:

\\"

现在因为 Java字符串文字中的\"也需要转义,这意味着每个字符都需要额外的反斜杠。添加引号,你就得到了:

"\\\\\""

这就是你的来源。

如果您只使用使用正则表达式的String.replace,则会更简单。这样你只是试图提供这个字符串(不是字符串文字)作为第二个参数:

\"

转义并转换为字符串文字后,变为:

"\\\""

仍然不是很好,但它至少更好。

另一种方法是使用replaceAll,但使用Matcher.quoteReplacement

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

我个人只是使​​用replace()。毕竟,你想要正则表达式替换。