2012-04-27 13 views
9

Próbowałem użyć gsub, aby usunąć znaki nie będące słowami w łańcuchu w aplikacji szyny. Użyłem poniższy kod:Dziwactwo z gsubem

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

ale jest nieprawidłowe, usunie nas k również. Prawidłowe jeden powinien być:

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

Ale moim problemem jest to, że test jednostka kontroler szyny, która zawiera powyższy kod korzystając rspec nie działa, test jednostka faktycznie przechodzi. Stworzyłem więc dość ekstremalny przypadek testowy w rspecu, aby powyższy przypadek testowy się nie powiódł, ale faktycznie minął. Jaki jest tutaj problem? Dlaczego test miałby przejść?

+2

Dlaczego test zakończy się niepowodzeniem? '/ [\ W]/i' to całkowicie poprawne wyrażenie regularne dla tego zadania, o ile widzę. Wsporniki są w tym przypadku niepotrzebne, ale nic nie szkodzi. –

+0

Czy rzeczywiście próbowałeś swoich wyrażeń regularnych w 'irb'? '" kkk ".gsub (..)' działa tak jak powinien, a wynikiem jest "kkk", więc test przechodzi. Jaki jest wynik, którego się spodziewasz? – Casper

+1

@Casper Właściwie, podczas uruchamiania '' kkk'.gsub (/ [\ W]/i, '') otrzymuję '" "'. Dla porównania uruchamianie '' kkk'.gsub (/ \ W/i, '') 'zwraca' 'kkk''. –

Odpowiedz

5

Ruby 1.9 przełączono na inny mechanizm wyrażeń regularnych (Oniguruma), który uwzględnia zmianę zachowania. To wygląda na błąd.

Dla przykładu, można obejść ten problem przez nie określając wielkość liter niewrażliwe:

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" 

Aktualizacja: Wygląda na to usunięcie grupy postać jest inne podejście. Być może takie negowane mecze nie muszą być poprawne w grupie postaci?

+0

Czy myślisz, że ... nie, to nie mogło ... bierzesz '\ W' i robisz' \ w', ponieważ nie ma w nim mowy? Właściwie to nie mogło tak być, prawda? O_O –

+0

Mam nadzieję, że nie ... Ale nigdy nie wiadomo. Najprawdopodobniej powinno to zostać opublikowane na http://bugs.ruby-lang.org, aby potwierdzić, gdzie leży wina – Nevir

+0

Błąd potwierdzony tutaj http://www.rubular.com/. Możesz przełączyć między 1.8.7 i 1.9.2 i zobaczyć różnicę. – Casper

Powiązane problemy