Я просто хочу знать, есть ли в регулярном выражении ruby оператор несоответствия, как !~
в Perl. Я считаю, что это неудобно (?!xxx)
или (?<!xxxx)
потому, что вы не можете использовать шаблоны регулярных выражений в этой xxx
части.
92
irb
и попробовать. Наверное, было бы быстрее, чем разместить вопрос SO.irb
и попробовать. Возможно, даже быстрее, чем отправка SO-вопроса, и отличная возможность проверить все в целом». Во всяком случае, я так это слышал.Ответы:
Да:
!~
работает нормально - вы, вероятно, думали, что это не так, потому что он отсутствует на странице документацииRegexp
. Тем не менее, это работает:irb(main):001:0> 'x' !~ /x/ => false irb(main):002:0> 'x' !~ /y/ => true
источник
!~
задокументирован в разделе " Объект" .RegExp#match?
, который вы легко можете отрицать. Согласно примечаниям к выпуску , он выделяет даже меньше, чем!~
AFAIK (?! Xxx) поддерживается:
2.1.5 :021 > 'abc1234' =~ /^abc/ => 0 2.1.5 :022 > 'def1234' =~ /^abc/ => nil 2.1.5 :023 > 'abc1234' =~ /^(?!abc)/ => nil 2.1.5 :024 > 'def1234' =~ /^(?!abc)/ => 0
источник
Вернувшись в Perl,
'foobar' !~ /bar/
было прекрасно проверить, что строка не содержит «bar».В Ruby, особенно с современным руководством по стилю, я думаю, что более явное решение более традиционное и легкое для понимания:
input = 'foobar' do_something unless input.match?(/bar/) needs_bar = !input.match?(/bar/)
Тем не менее, я думаю, было бы здорово, если бы был
.no_match?
метод.источник