Estoy tratando de encontrar la forma de reemplazar una cita como '
con algo así como \'
.Reemplazar 'con ' en Ruby?
¿Cómo podría hacer esto?
He tratado
"'".gsub("'","\\'")
pero simplemente da una cadena vacía. ¿Qué estoy haciendo mal aquí?
Estoy tratando de encontrar la forma de reemplazar una cita como '
con algo así como \'
.Reemplazar 'con ' en Ruby?
¿Cómo podría hacer esto?
He tratado
"'".gsub("'","\\'")
pero simplemente da una cadena vacía. ¿Qué estoy haciendo mal aquí?
¿Qué tal esto
puts "'".gsub("'","\\\\'")
\'
La razón es que \'
significa posterior al partido en gsub (expresiones regulares) y debido a que necesita para ser escapado con \\'
y \
obviamente se escapó como \\
, terminando con \\\\'
.
Ejemplo
>> "abcd".gsub("a","\\'")
=> "bcdbcd"
a
se sustituye con todo después de a
.
Gracias por explicarme eso ... supongo que gsub solo tiene algunas "características" ocultas – Earlz
¿Cómo hacer esto:
"'".gsub("\\","\\\\\\\\").gsub("'","\\\\'")
No
bonita, pero creo que funciona ...
que podría ser un error .. O por lo menos, algo que se rompe mi idea de la 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"
Sí, esto es no tiene sentido para mí ... seguro que podría usar Regex para eso, pero eso parece exagerado. – Earlz
La variable $'
es la cadena a la derecha del partido. En la cadena de reemplazo gsub
, la misma variable sería \'
- de ahí el problema.
x = "'foo'"
x.gsub!(/'/, "\\'")
puts x.inspect # foo'foo
Esto debería funcionar:
x = "'foo'"
x.gsub!(/'/, "\\\\'")
puts x.inspect
puts x
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, ...
He editado mi respuesta – marcgg
Espero que no intentes escapar de la entrada de SQL. Siempre 'prepare' sus declaraciones. –
No, está escapando código, pero no SQL. – Earlz