9

如何将“替换为\”。

这是我正在尝试的:

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
4

3 回答 3

14

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

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

scala> line.replaceAllLiterally("\"", "\\\"")
res8: String = replace \" quote
于 2012-08-26T02:09:43.733 回答
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

第二层是正则表达式解释器。这一个更难看到,但可以通过您的示例中的 apply 看到:

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

什么注册。exp。解释器真正收到的是\",它被解释为只有". 所以,我们需要注册。exp。接收 \\"。为了让编译器给我们 \ 我们需要写 \\.

让我们看一下转义:

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

尽管非常直截了当,但它可能有点令人困惑。

正如@sschaef 所指出的,另一种使用 """ 三引号的替代方法,这种形式的字符串不会被编译器转义:

scala>  line.replaceAll("\"" , """\\"""");
res6: java.lang.String = replace \" quote
于 2012-08-24T19:06:34.423 回答
0

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

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

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

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

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

于 2015-03-05T16:45:36.757 回答