用。。。来代替 \”

时间:2012-08-24 19:00:43

标签: scala

如何更换"用\"。

以下是我的尝试:

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

输出:

replace " quote
replace " quote

输出应为:

replace " quote
replace \" quote

3 个答案:

答案 0 :(得分:13)

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

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

scala> line.replaceAllLiterally("\"", "\\\"")
res8: String = replace \" quote

答案 1 :(得分:9)

另外两个\\完成工作:

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

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

让我们看看unescaping:

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

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

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

scala>  line.replaceAll("\"" , """\\"""");
res6: java.lang.String = replace \" quote

答案 2 :(得分:0)

@pedrofurla很好地解释了为什么你看到了你所做的行为。您的问题的另一个解决方案是使用带有scala的三引号字符的原始字符串。一对三引号之间的任何内容都被视为原始字符串,Scala编译器无法解释。因此:

scala> line.replaceAll("\"", """\\"""")
res1: String = replace \" quote

stripMargin结合使用时,三引号是将原始字符串嵌入代码的强大方法。例如:

val foo = """
        |hocus
        |pocus""".stripMargin

产生字符串:"\nhocus\npocus"