再加上两个 \\
就可以完成此操作:
scala> line.replaceAll("\"" , "\\\\\"")
res5: java.lang.String = replace \" quote
问题在于有两个“层”来转义字符串。第一层是编译器,我们可以在REPL中很容易地看到:
scala> "\""
res0: java.lang.String = "
scala> "\\"
res1: java.lang.String = \
scala> "\\\""
res2: java.lang.String = \"
scala> val line:String = "replace \" quote";
line: String = replace " quote
第二层是正则表达式解释器,它比较难以看到,但可以通过应用您的示例来看到:
scala> line.replaceAll("\"" , "\\\"");
res5: java.lang.String = replace " quote
正则表达式解析器真正接收到的是\", 被解释为只有"。因此,我们需要让正则表达式接收\\"。为了让编译器给我们\,我们需要写成\\。
让我们来看一下反转义:
- 正确的情况:\\\" 编译器看到\",正则表达式看到\"。
- 错误的情况:\\" 编译器看到\",正则表达式看到"。
尽管非常简单易懂,但这可能有点令人困惑。
如@sschaef所指出的那样,另一个选择是使用"""三引号,以这种形式的字符串不会被编译器反转义:
scala> line.replaceAll("\"" , """\\"""");
res6: java.lang.String = replace \" quote