2012-08-24 19 views
9

¿Cómo reemplazo "con \".Reemplazar "con "

Aquí es lo que estoy tratando:

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

de salida:

replace " quote 
replace " quote 

la salida debe ser:

replace " quote 
replace \" quote 

Respuesta

9

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 
+0

val = updatedLine line.replaceAll ("\" " "\\\\\"") que funcionó para mí (que necesitaba 5 cotizaciones por alguna razón) –

+0

Se estaba escribiendo :) – pedrofurla

+1

Para evitar confusiones, sugiero usar '" "" ... "" "' en lugar de '" ... "' – sschaef

13

uso 'método replaceAllLiterally' de la clase StringOps. Esto reemplaza todas las ocurrencias literales del argumento:

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

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

¿Y cuál es la diferencia entre .replaceAllLiterally y .replace? – Rogach

+0

¡Bien, no sabía de esto! – pedrofurla

+0

Awesome find! Gracias –

0

@pedrofurla explica muy bien por qué viste el comportamiento que hiciste. Otra solución a su problema sería usar una cadena sin formato con el carácter de comillas triples de scala. Cualquier cosa entre un par de comillas triples se trata como una cadena en bruto sin interpretación por el compilador de Scala. Por lo tanto:

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

se utiliza conjuntamente con stripMargin, comillas triples son una forma eficaz de integrar cadenas crudos en su código. Por ejemplo:

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

produce la cadena: "\nhocus\npocus"