2010-02-15 11 views
14

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í?

+0

He editado mi respuesta – marcgg

+0

Espero que no intentes escapar de la entrada de SQL. Siempre 'prepare' sus declaraciones. –

+0

No, está escapando código, pero no SQL. – Earlz

Respuesta

27

¿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.

+0

Gracias por explicarme eso ... supongo que gsub solo tiene algunas "características" ocultas – Earlz

-1

¿Cómo hacer esto:

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

bonita, pero creo que funciona ...

+0

La versión destructiva tampoco funciona. simplemente devuelve una cadena en blanco del prompt de irb – Earlz

+0

Ok, déjame echarle un vistazo – marcgg

+0

La versión de Ruby es 'ruby 1.8.6 (2009-06-08 patchlevel 369) [x86_64-openbsd4.6]' – Earlz

0

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

Sí, esto es no tiene sentido para mí ... seguro que podría usar Regex para eso, pero eso parece exagerado. – Earlz

2

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 
0

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, ...