9

gsubRailsアプリで文字列内の単語以外の文字を削除するために使用しようとしていました。次のコードを使用しました。

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

しかし、実際には正しくありません。文字も削除kされます。正しいものは次のとおりです。

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

しかし、私の問題は、rspecを使用した上記のコードを含むRailsコントローラーの単体テストが機能せず、単体テストが実際に合格することです。だから私はrspecでかなり極端なテストケースを作成しました

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

上記のテストケースは失敗するはずですが、実際には合格です。ここでの問題は何ですか?なぜテストに合格するのでしょうか?

4

1 に答える 1

5

Ruby 1.9 switched to a different regular expression engine (Oniguruma), which accounts for the behavior change. This seems like a bug in it.

For your example, you can get around the issue by not specifying a case insensitive match:

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"

Update: It looks like removing the character group is another approach. It might be that negated matches like that aren't necessarily valid in a character group?

于 2012-04-27T15:34:49.953 に答える