2012-04-27 15 views
9

Stavo cercando di utilizzare gsub per rimuovere i caratteri non di una stringa in un'app di rotaia. Ho usato il seguente codice:Strangie con gsub

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

ma in realtà è errata, rimuoverà lettera k pure. Il corretto dovrebbe essere:

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

Ma il mio problema è che l'unit test di un controller rotaie che contiene il codice di cui sopra utilizzando rspec non funziona, il test di unità in realtà passa. Così ho creato un banco di prova abbastanza estremo in rspec

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

il banco di prova di cui sopra dovrebbe fallire, ma passa in realtà. Qual è il problema qui? Perché il test dovrebbe passare?

+2

Perché il test fallisce? '/ [\ W]/i' è un'espressione regolare valida per quel compito, per quanto posso vedere. In questo caso, le staffe non sono necessarie, ma non danneggia nulla. –

+0

Hai effettivamente provato le tue espressioni regolari in 'irb'? '" kkk ".gsub (..)' funziona come dovrebbe, e il risultato è "kkk", quindi il test passa. Qual è il risultato che ti aspetti? – Casper

+1

@Casper In realtà, quando si esegue ''kkk'.gsub (/ [\ W]/i,' ')' Ottengo '" "' '. In confronto, l'esecuzione di ''kkk'.gsub (/ \ W/i,' ')' restituisce '" kkk "'. –

risposta

5

Ruby 1.9 è passato a un motore di espressioni regolari diverso (Oniguruma), che tiene conto del cambiamento di comportamento. Questo sembra un insetto.

Per esempio, è possibile aggirare il problema non specificando una tra maiuscole e minuscole:

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" 

Aggiornamento: Sembra che la rimozione del gruppo di caratteri è un altro approccio. Potrebbe essere che partite negative come quelle non sono necessariamente valide in un gruppo di personaggi?

+0

Pensi che ... no non potrebbe ... sta prendendo '\ W' e rendendolo' \ w' perché è case insensitive? Non potrebbe effettivamente farlo, giusto ?? O_O –

+0

Spero di no ... Ma non si sa mai. Questo dovrebbe probabilmente essere riportato su http://bugs.ruby-lang.org per confermare dove si trova la colpa – Nevir

+0

Bug confermato qui http://www.rubular.com/ anche. È possibile alternare tra 1.8.7 e 1.9.2 e vedere la differenza. – Casper