如何更换"用\"。
以下是我的尝试:
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
答案 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"