如果我有字符串a"b"c",但我想得到a\"b\"c\",我自然会写
String t = "a\"b\"c\"";
t = t.replaceAll("\"", "\\\"");
Run Code Online (Sandbox Code Playgroud)
但是,这导致相同的字符串,a"b"c".正确的方法是
t.replaceAll("\"", "\\\\\"");
Run Code Online (Sandbox Code Playgroud)
为什么?
replaceAll对模式和替换使用正则表达式 - 两者都需要转义反斜杠.所以你想要的第二个参数的正则表达式替换模式是:
\\"
Run Code Online (Sandbox Code Playgroud)
现在,因为两者\并"在Java字符串字面量也需要转义,这意味着每个这些字符需要额外的反斜线.添加引号,你有:
"\\\\\""
Run Code Online (Sandbox Code Playgroud)
这是你在源头中得到的.
所以,很简单,如果你只使用String.replace其中不使用正则表达式.这样你只是试图提供这个字符串(而不是字符串文字)作为第二个参数:
\"
Run Code Online (Sandbox Code Playgroud)
转义并转换为字符串文字后,变为:
"\\\""
Run Code Online (Sandbox Code Playgroud)
它仍然不是很好,但它至少更好.
另一种方法是使用replaceAll但是Matcher.quoteReplacement:
t = t.replaceAll("\"", Matcher.quoteReplacement("\\\""));
Run Code Online (Sandbox Code Playgroud)
就个人而言,我只是使用replace().你不想要的正则表达式替换,毕竟.