Pregunta

Estoy tratando de encontrar la manera de reemplazar una cita como ' con algo como \'.

¿Cómo puedo hacer esto?

He tratado

"'".gsub("'","\\'")

pero solo da una cadena vacía. ¿Qué estoy haciendo mal aquí?

¿Fue útil?

Solución

¿Qué tal esto

puts "'".gsub("'","\\\\'")
\'

La razón es que los medios \' después del partido en gsub (expresiones regulares) y debido a que necesita ser escapado con \\' y \, obviamente, se evitan como se \\, para terminar con \\\\'.

Ejemplo

>> "abcd".gsub("a","\\'")
=> "bcdbcd"

a se sustituye con todo después de a.

Otros consejos

La variable $' es la cadena a la derecha del partido. En la cadena de reemplazo gsub, la misma variable se \' -. Por lo tanto, el problema

x = "'foo'"
x.gsub!(/'/, "\\'")
puts x.inspect        # foo'foo

Esto debería funcionar:

x = "'foo'"
x.gsub!(/'/, "\\\\'")
puts x.inspect
puts x

Eso podría ser un error .. O por lo menos, algo que se rompe mi idea del principio de la menor sorpresa.

irb(main):039:0> "life's grand".gsub "'", "\\\'"
=> "lifes grands grand"
irb(main):040:0> "life's grand".gsub "'", "\\\\'"
=> "life\\'s grand"

Un enfoque de dos pasos que he usado en realidad ...

BACKSLASH = 92.chr
temp = "'".gsub("'", "¤'")
puts temp.gsub("¤", BACKSLASH)
=> "\'"

sólo funcionará si '¤' no se utiliza en el texto, obviamente, ...

¿Cómo hacer esto:

"'".gsub("\\","\\\\\\\\").gsub("'","\\\\'")

No es bonita, pero creo que funciona ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top