2011-06-02 21 views

Respuesta

16

Tenga en cuenta que esta respuesta fue entregada en el ruby ​​1.9. Como ruby ​​ 2.0 tiene un nuevo motor de expresiones regulares, es posible que no sea válido en ese contexto.

Esto funciona:

str.gsub!("\\", "\\\\\\") 
str.gsub!("\\", "\\\\\\\\") # also, will always work 

Editar: Explicación (a través de http://www.ruby-forum.com/topic/143645 proporcionada por @vache)

de responsabilidad: No estoy familiarizado con el funcionamiento interno del motor de expresiones regulares de rubí, cualquier información aquí se deduce del artículo mencionado anteriormente.

Lo básico es saber que la cadena de reemplazo se evalúa 2 veces.

La primera vez que las barras hacen su trabajo como escapes en la cadena, en la segunda vez gsub buscará en la cadena las referencias de grupo.

como mencionó @ chris-johnsen, 6 barras no siempre funcionan. Esto me lleva a creer que algo así está sucediendo:

Para 6 barras diagonales. 3 barras se pasan a la capa de referencia del grupo. La barra inclinada final se interpreta no como un carácter de escape porque nada viene después, se interpreta como una barra diagonal inversa. Así que finalmente esta capa devuelve 2 barras. Si algo lo sigue, la expresión fallará, ya que la tercera barra ahora funcionará como un carácter de escape.

Para 8 barras diagonales: 4 barras se pasan a la capa de referencia del grupo. Las cuatro barras se reducirán a dos.

+4

Hay una discusión [aquí] (http://www.ruby-forum.com/topic/143645) sobre por qué es así. – Vache

+0

Lo intento con 8 (!) Barras invertidas y creo que está funcionando ... –

+1

si agrega una explicación (el enlace de Vache es útil), aceptaré su respuesta. No me gusta aceptar respuestas que brinden la solución sin explicar por qué es la solución. También puedes explicar por qué funciona con las barras diagonales 6 y 8, porque no lo entiendo muy bien ... –

Cuestiones relacionadas