2009-04-04 23 views

Respuesta

1

Su problema es que la cadena "\ '" es significativa para gsub en una cadena de reemplazo. Para que funcione de la manera que desee, debe usar el formulario de bloque.

s.gsub("'") {"\\'"} 
4
>> puts s.gsub("'", "\\\\'") 
children\'s world 
+1

Consigue el mundo de los niños. – Jirapong

+0

No, no es así. – Magnar

+5

@Jirapong la razón por la que cree que se obtiene \\ es porque la consola de rieles no muestra la cadena, pero muestra cómo se podría construir la cadena. Entonces, si ingresas "\\", se mostrará el evento "\\" aunque es una cadena con una sola barra invertida. Para descubrir qué hay realmente en la cadena, debe usar ** puts **. Por ejemplo, pone "\\" mostrará una sola barra invertida. – Brian

11

de ruby-doc.org sobre el patrón de sustitución para gsub:

las secuencias de \ 1, \ 2, y así sucesivamente puede usarse para interpolar grupos sucesivos en el partido

Esto incluye la secuencia \', que significa "todo lo que hice después".

De cualquier "\\'" o '\\\'' los dos para producir \' (recordar que \ tiene que ser escapado en ambos dobles y cadenas entre comillas sencillas, y que ' tiene que ser escapado en las cadenas entre comillas simples, por lo que usar comillas simples en este case realmente hace las cosas más verbose). Ej .:

puts "before*after".gsub("*", "\\'") 
"beforeafterafter" 

puts "before*after".gsub("*", '\\\'') 
"beforeafterafter" 

Lo que se quiere gsub a ver a continuación, es en realidad \\', que puede producirse tanto por "\\\\'" y '\\\\\''. Por lo tanto:

puts s.gsub("'", "\\\\'") 
children\'s world 

puts s.gsub("'", '\\\\\'') 
children\'s world 

o si tiene que ver mucho con \ se podría aprovechar el hecho de que cuando se utiliza /.../ (o %r{...}) usted no tiene que hacer doble escapar las barras invertidas:

puts s.gsub("'", /\\'/.source) 
children\'s world 
Cuestiones relacionadas