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
val updatedLine = line.replaceAll ("\" " "\\\\\"") ha lavorato per me (avevo bisogno di 5 preventivi per qualche motivo). –
Stava scrivendo :) – pedrofurla
Per evitare confusione, suggerisco di usare "" "" ... "" "invece di' "..." ' – sschaef