Dos más \\
hace el trabajo:
scala> line.replaceAll("\"" , "\\\\\"");
res5: java.lang.String = replace \" quote
El problema aquí es que hay dos 'capas' que escapan de las cadenas. La primera capa es el compilador, que podemos ver fácilmente en el 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
La segunda capa es el intérprete de expresiones regulares. Este es más difícil de ver, pero puede verse aplicando en su ejemplo:
scala> line.replaceAll("\"" , "\\\"");
res5: java.lang.String = replace " quote
What the reg. exp. el intérprete realmente recibe es \ ", que se interpreta solo como". Entonces, necesitamos el reg. exp. recibir \\ "Para que el compilador nos dan \ tenemos que escribir \\
Veamos el unescape:.
- El caso derecha: \\\" el compilador ve \", el expresión regular ve \ ".
- El caso incorrecto:.. \\ "el compilador ve \", la expresión regular ve"
Puede ser un poco confuso a pesar de ser muy sencillo
Como se señaló por @sschaef, otra alternativa es utilizar """ triple citar, cadenas en esta forma no son literalmente de forma por el compilador:
scala> line.replaceAll("\"" , """\\"""");
res6: java.lang.String = replace \" quote
val = updatedLine line.replaceAll ("\" " "\\\\\"") que funcionó para mí (que necesitaba 5 cotizaciones por alguna razón) –
Se estaba escribiendo :) – pedrofurla
Para evitar confusiones, sugiero usar '" "" ... "" "' en lugar de '" ... "' – sschaef