2008-09-26 10 views
6

Estoy tratando de aprender Regex en Ruby, basado en lo que estoy leyendo en "The Rails Way". Pero, incluso este simple ejemplo me está golpeando. No puedo decir si se trata de un error tipográfico o no ...Ruby Regex problema text.gsub [^ W-], '') falla

text.gsub (/ \ s/"-"). Gsub ([^ \ W], '') .downcase

Me parece que esto reemplazaría todos los espacios con -, luego, en cualquier lugar donde una cadena comience con una letra o número no seguido de un guión, reemplázalo con ''. Pero, usando IRB, falla primero en^"error de sintaxis, inesperado '^', esperando ']'", y si saco el ^, falla de nuevo en el W.

Estoy bastante confundido aquí .

Respuesta

9
>> text = "I love spaces" 
=> "I love spaces" 
>> text.gsub(/\s/, "-").gsub(/[^\W-]/, '').downcase 
=> "--" 

Missing //

Aunque esto hace un poco más de sentido :-)

>> text.gsub(/\s/, "-").gsub(/([^\W-])/, '\1').downcase 
=> "i-love-spaces" 

Y esto es probablemente lo que se quiere decir

>> text.gsub(/\s/, "-").gsub(/[^\w-]/, '').downcase 
=> "i-love-spaces" 

\ W significa "ni una palabra" \ w significa "una palabra"

El // generar un objeto de expresión regular

/[^\W-]/.class => Regexp

2

Ha olvidado las barras. Debe ser /[^\W-]/

1

Las barras son decir que la cosa entre ellos es una expresión regular, al igual que las comillas dicen que la cosa entre ellos es una cadena.

2

Bueno, .gsub (/ [^ \ W -] /, '') dice reemplazar cualquier cosa que no sea una palabra ni una - para nada.

es probable que desee

>> text.gsub(/\s/, "-").gsub(/[^\w-]/, '').downcase 
=> "i-love-spaces" 

Minúsculas \ w (\ W es justo lo contrario)

+0

Hermoso. Eso funcionó perfectamente. Gracias. – scubabbl

3

Paso 1: Add this to your bookmarks. Cada vez que necesito para buscar expresiones regulares, es mi primera parada

Paso 2: Vamos a caminar a través de su código

text.gsub(/\s/, "-") 

Estás llamando a la función gsub, y dándole 2 parámetros.
El primer parámetro es /\s/, que es el rubí para "crear una nueva expresión regular que contiene \s (la // son como especial '' para expresiones regulares).
El segundo parámetro es la cadena "-".

Esto, por tanto, sustituir todos los personajes de espacio en blanco con guiones. Hasta ahora, todo bien.

.gsub([^\W-], '').downcase 

A continuación, vuelva a llamar a gsub pasándole 2 parámetros. El primer parámetro es [^\W-]. Como no lo citamos en barras inclinadas hacia adelante, ruby ​​literalmente intentará ejecutar ese código. [] crea una matriz, luego trata de poner ^\W- en la matriz, que no es un código válido, por lo que se rompe.
Cambiándolo a /[^\W-]/ nos da una expresión regular válida.

En cuanto a la expresión regular, el [] dice 'coincide con cualquier carácter de este grupo. El grupo contiene \W (que significa carácter no de palabra) y -, por lo que la expresión regular debe coincidir con cualquier carácter no de palabra o cualquier guión.

A medida que la segunda cosa que pase a gsub es una cadena vacía, se debe llegar a la sustitución de todos los caracteres no-palabra y guiones con la cadena vacía (separándose así fuera)

.downcase 

Lo cual convierte la cuerda a minúsculas

Espero que esto ayude :-)