2012-04-27 5 views
9

Я пытался использовать gsub для удаления символов без слов в строке в приложении rails. Я использовал следующий код:Weirdness with 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, '') 'I get' "" '. Для сравнения, запуск '' 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" 

Update: Похоже, удаление группы символов другой подход. Может быть, что отрицательные совпадения вроде бы не обязательно действительны в группе символов?

+0

Как вы думаете ... нет, это не могло ... он принимает '\ W' и делает его' \ w', потому что он нечувствителен к регистру? На самом деле это не могло быть так, правильно? O_O –

+0

Надеюсь, нет ... Но вы никогда не знаете. Вероятно, это должно быть поднято на http://bugs.ruby-lang.org, чтобы подтвердить, где виновата – Nevir

+0

Ошибка подтверждена здесь http://www.rubular.com/. Вы можете переключаться между 1.8.7 и 1.9.2 и видеть разницу. – Casper