2012-08-24 20 views
9

Come sostituire "con \".Sostituisci "con "

Ecco cosa im cercando:

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

uscita:

replace " quote 
replace " quote 

L'output dovrebbe essere:

replace " quote 
replace \" quote 

risposta

9

Altri due \\ fa il lavoro:

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

Il problema è che ci sono due 'strati' che sfuggono alle stringhe. Il primo strato è il compilatore, che possiamo facilmente vedere nella 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 

Il secondo strato è l'interprete espressione regolare. Questo è più difficile da vedere, ma può essere visto applicando il tuo esempio:

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

Che reg. exp. l'interprete riceve veramente è \ ", che viene interpretato solo come". Quindi, abbiamo bisogno del reg. exp. per ricevere \\ "Per rendere il compilatore darci \ abbiamo bisogno di scrivere \\

Vediamo l'unescaping:.

  • Il caso a destra: \\\" il compilatore vede \", il l'espressione regolare vede \ ".
  • Il caso sbagliato:.. \\ "il compilatore vede \", l'espressione regolare vede"

Può essere un po 'di confusione, pur essendo molto semplice

Come sottolineato da @sschaef, un'altra alternativa è l'utilizzo """ triple-cita, stringhe in questa forma non sono escape dal compilatore:

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

val updatedLine = line.replaceAll ("\" " "\\\\\"") ha lavorato per me (avevo bisogno di 5 preventivi per qualche motivo). –

+0

Stava scrivendo :) – pedrofurla

+1

Per evitare confusione, suggerisco di usare "" "" ... "" "invece di' "..." ' – sschaef

13

Uso 'metodo replaceAllLiterally' di classe StringOps. Sostituisce tutte le occorrenze letterali dell'argomento:

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

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

E qual è la differenza tra .replaceAllLiterally e .replace? – Rogach

+0

Bello, non sapevo di questo! – pedrofurla

+0

Incredibile scoperta! Grazie –

0

@pedrofurla spiega bene perché hai visto il comportamento che hai fatto. Un'altra soluzione al tuo problema potrebbe essere quella di usare una stringa grezza con il carattere di virgola tripla di scala. Qualsiasi cosa tra una coppia di virgolette è trattata come una stringa non elaborata senza alcuna interpretazione da parte del compilatore Scala. Così:

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

utilizzato in combinazione con stripMargin, triple virgolette sono un modo potente per incorporare le stringhe prime nel codice. Per esempio:

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

cede la stringa: "\nhocus\npocus"

Problemi correlati