还有两个\\
做这项工作:
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
第二层是正则表达式解释器。这一个更难看到,但可以通过您的示例中的 apply 看到:
scala> line.replaceAll("\"" , "\\\"");
res5: java.lang.String = replace " quote
什么注册。exp。解释器真正收到的是\",它被解释为只有". 所以,我们需要注册。exp。接收 \\"。为了让编译器给我们 \ 我们需要写 \\.
让我们看一下转义:
- 正确的情况:\\\" 编译器看到\",正则表达式看到\"。
- 错误情况:\\" 编译器看到\",正则表达式看到"。
尽管非常直截了当,但它可能有点令人困惑。
正如@sschaef 所指出的,另一种使用 """ 三引号的替代方法,这种形式的字符串不会被编译器转义:
scala> line.replaceAll("\"" , """\\"""");
res6: java.lang.String = replace \" quote