用...来代替 \"

blu*_*sky 9 scala

如何替换"with".

以下是我的尝试:

def main(args:Array[String]) = {      
  val line:String = "replace \" quote";
  println(line);
  val updatedLine = line.replaceAll("\"" , "\\\"");
  println(updatedLine);
}
Run Code Online (Sandbox Code Playgroud)

输出:

replace " quote
replace " quote
Run Code Online (Sandbox Code Playgroud)

输出应该是:

replace " quote
replace \" quote
Run Code Online (Sandbox Code Playgroud)

小智 13

使用StringOps类的"replaceAllLiterally"方法.这将替换参数的所有字面值:

scala> val line:String = "replace \" quote"
line: String = replace " quote

scala> line.replaceAllLiterally("\"", "\\\"")
res8: String = replace \" quote
Run Code Online (Sandbox Code Playgroud)


ped*_*rla 9

还有两个\\工作:

scala>  line.replaceAll("\"" , "\\\\\"");
res5: java.lang.String = replace \" quote
Run Code Online (Sandbox Code Playgroud)

这里的问题是有两个'层'逃脱字符串.第一层是编译器,我们可以在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
Run Code Online (Sandbox Code Playgroud)

第二层是正则表达式解释器.这个更难看,但可以通过应用你的例子看到:

scala>  line.replaceAll("\"" , "\\\"");
res5: java.lang.String = replace " quote
Run Code Online (Sandbox Code Playgroud)

什么reg.进出口.解释器真的收到的是","这只被解释为".所以,我们需要reg.进出口.接收\\".为了让编译器给我们\我们需要写\\.

让我们看看unescaping:

  • 正确的情况:\\\"编译器看到\",正则表达式看到\".
  • 错误的情况:\\"编译器看到\",正则表达式看到".

尽管非常直接,但它可能有点令人困惑.

正如@sschaef指出的那样,使用""三重引号的另一种选择,这种形式的字符串不会被编译器取消:

scala>  line.replaceAll("\"" , """\\"""");
res6: java.lang.String = replace \" quote
Run Code Online (Sandbox Code Playgroud)