2012-08-24 46 views
9

如何替換「with \」。替換「with 」

這裏是我嘗試:

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 

回答

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 

第二層是正則表達式解釋器。這一個是很難看到,但可以通過applyin您的例子可以看出:

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

什麼REG。進出口。口譯員確實收到的是「,這被解釋爲」。所以,我們需要註冊。進出口。接收\\「爲了使編譯器給我們\我們需要寫\\

讓我們來看看轉義:

  • 正確的情況下:\\\」編譯器看到\」中,正則表達式看到\「。
  • 錯誤的情況下:\\「編譯器看到\」,正則表達式看到」

它可以是一個有點混亂,儘管是非常簡單的

正如指出的@sschaef,另一種選擇是使用「」」三報價,這種形式的字符串不是由編譯器轉義:

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

VAL updatedLine = line.replaceAll( 「\」 「 」\\\\\「」)工作對我來說(我需要5個報價出於某種原因)。 –

+0

它被寫入:) – pedrofurla

+1

爲了避免混淆,我建議使用'「」「...」「」'而不是'「...」' – sschaef

13

使用‘replaceAllLiterally’StringOps類的方法。這取代了參數的所有字面意思:

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

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

.replaceAllLiterally和.replace之間有什麼區別? – Rogach

+0

不錯,不知道這個! – pedrofurla

+0

真棒找!謝謝 –

0

@pedrofurla很好地解釋了爲什麼你看到了你所做的行爲。你的問題的另一個解決方案是使用scala的三引號字符的原始字符串。一對三引號之間的任何內容都被視爲原始字符串,Scala編譯器不會解釋。因此:

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

配合使用stripMargin,三重引號嵌入原始字符串到你的代碼的有效途徑。例如:

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

得到的字符串:"\nhocus\npocus"

相關問題