用\"替换\"

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
3个回答

14
使用StringOps类的"replaceAllLiterally"方法。这将替换所有参数的字面出现:
scala> val line:String = "replace \" quote"
line: String = replace " quote

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

.replaceAllLiterally和.replace之间有什么区别? - Rogach
不错,我不知道这个! - pedrofurla

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

正则表达式解析器真正接收到的是\", 被解释为只有"。因此,我们需要让正则表达式接收\\"。为了让编译器给我们\,我们需要写成\\。
让我们来看一下反转义:
- 正确的情况:\\\" 编译器看到\",正则表达式看到\"。 - 错误的情况:\\" 编译器看到\",正则表达式看到"。
尽管非常简单易懂,但这可能有点令人困惑。
如@sschaef所指出的那样,另一个选择是使用"""三引号,以这种形式的字符串不会被编译器反转义:
scala>  line.replaceAll("\"" , """\\"""");
res6: java.lang.String = replace \" quote

val updatedLine = line.replaceAll(""" , "\\"") 对我很有用(由于某种原因,我需要5个引号)。 - blue-sky
1
为避免混淆,我建议使用 """...""" 而不是 "..." - kiritsuku
@sschaef,说得好。这本来应该在回答中提到的,但我意识到解释真正发生的事情更有用后,完全忘记了它。 - pedrofurla

0

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

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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接