2012-04-27 14 views
9

私はgsubを使って、レールアプリの文字列の非単語文字を削除しようとしていました。私は、次のコードを使用:gsubの奇妙さ

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

をしかし、それは実際には間違っている、それは同様に手紙kを削除します。正しいものは次のようになります。

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

しかし、私の問題は、RSpecのを使用して、上記のコードが含まれているレールコントローラのユニットテストが動作しないということで、ユニットテストは、実際に渡されます。だから私はRSpecの

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

上記のテストケースは失敗するにはかなり極端なテストケースを作成し、それが実際に渡されます。ここでの問題は何ですか?なぜテストは合格するのですか?

+2

なぜテストに失敗しますか? '/ [\ W]/i'は私が見る限り、その仕事のための完全に有効な正規表現です。その場合、大括弧は不要ですが、何も傷つけることはありません。 –

+0

あなたは実際にあなたの正規表現を 'irb'で試しましたか? '' kkk ".gsub(..)'それはうまく動作し、結果は "kkk"なので、テストに合格します。期待している結果は何ですか? – Casper

+1

@Casper実際には '' kkk'.gsub(/ [\ W]/i、 '') 'を実行すると' '' 'となります。これと比較して、 '' kkk'.gsub(/ \ W/i、 '') 'を実行すると' 'kkk ''が返されます。 –

答えて

5

Ruby 1.9が動作の変更を説明する別の正規表現エンジン(Oniguruma)に切り替えました。これはバグのようだ。ご例えば

、あなたは大文字小文字を区別しないマッチングを指定しないことで問題を回避することができます

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" 

更新:それは文字のグループが別のアプローチで取り除くように見えます。そのようなネガティブなマッチは、文字グループ内で必ずしも有効ではないことがありますか?

+0

あなたはそう思っていますか?それはできません...大文字小文字を区別しないので、 '\ W'を使って' \ w'にしていますか?実際にそうすることはできませんでした。 O_O –

+0

私は望んでいない...しかし、あなたは決して知らない。これはおそらく、http://bugs.ruby-lang.orgに投稿して、どこに責任があるのか​​確認してください。 – Nevir

+0

バグはhttp://www.rubular.com/でも確認されています。 1.8.7と1.9.2の間で切り替えて、その違いを見ることができます。 – Casper