2012-04-27 19 views
9

Estaba tratando de usar gsub para eliminar caracteres que no sean palabras en una cadena en una aplicación de rieles. He utilizado el siguiente código:Weirdness con gsub

somestring.gsub(/[\W]/i, '') #=> "" 

pero en realidad es incorrecta, se eliminará carta k también. La correcta debería ser:

somestring.gsub(/\W/i, '') #=> "kkk" 

Pero mi problema es que la prueba unitaria de un controlador de rieles que contiene el código anterior utilizando rspec no funciona, la prueba de la unidad pasa en realidad. Así que creé un caso de prueba bastante extremo en rspec

it "test this gsub" do 
    'kkk'.gsub(/[\W]/i, '').should == 'kkk' 
end 

el caso de prueba anterior falla, pero en realidad pasa. ¿Cuál es el problema aquí? ¿Por qué pasaría la prueba?

+2

¿Por qué fallaría la prueba? '/ [\ W]/i' es una expresión regular completamente válida para esa tarea, hasta donde puedo ver. Los corchetes son innecesarios en ese caso, pero no duele nada. –

+0

¿De verdad probaste tus expresiones regulares en 'irb'? '" kkk ".gsub (..)' funciona como debería y el resultado es "kkk", por lo que la prueba pasa. ¿Cuál es el resultado que estás esperando? – Casper

+1

@Casper En realidad, cuando ejecuto ''kkk.gsub (/ [\ W]/i, '')' obtengo '" "'. En comparación, ejecutando ''kkk.gsub (/ \ W/i, '')' devuelve '" kkk "'. –

Respuesta

5

Ruby 1.9 cambió a un motor de expresiones regulares diferente (Oniguruma), lo que explica el cambio de comportamiento. Esto parece un error.

Para su ejemplo, se puede obtener en torno al tema al no especificar un partido de mayúsculas y minúsculas:

irb(main):001:0> 'kkk'.gsub(/[\W]/i, '') 
=> "" 
irb(main):002:0> 'kkk'.gsub(/[\W]/, '') 
=> "kkk" 
irb(main):004:0> 'kkk'.gsub(/\W/i, '') 
=> "kkk" 
irb(main):003:0> 'kkk'.gsub(/\W/, '') 
=> "kkk" 

Actualización: Parece que la eliminación del grupo de caracteres es otro enfoque. ¿Podría ser que las coincidencias negadas como esa no sean necesariamente válidas en un grupo de caracteres?

+0

¿Crees que ... no podría ... está tomando '\ W' y convirtiéndolo en' \ w' porque no distingue entre mayúsculas y minúsculas? No podría estar haciendo eso, ¿verdad? O_O –

+0

Espero que no ... Pero nunca se sabe. Esto probablemente debería aparecer en http://bugs.ruby-lang.org para confirmar dónde radica la culpa – Nevir

+0

Error confirmado aquí http://www.rubular.com/ también. Puede cambiar entre 1.8.7 y 1.9.2 y ver la diferencia. – Casper

Cuestiones relacionadas