Есть ли у регулярного выражения Ruby оператор несовпадения, такой как «! ~» В Perl?


92

Я просто хочу знать, есть ли в регулярном выражении ruby ​​оператор несоответствия, как !~в Perl. Я считаю, что это неудобно (?!xxx)или (?<!xxxx)потому, что вы не можете использовать шаблоны регулярных выражений в этой xxxчасти.


8
Все, что вам нужно было сделать, это запустить irbи попробовать. Наверное, было бы быстрее, чем разместить вопрос SO.
Марк Томас

33
Но не быстрее, чем поискать в Google «ruby not match» и найти ответ на SO;)
micapam

3
Я поэкспериментировал некоторое время, прежде чем застрял, погуглил и нашел этот ответ (который сработал). Никогда не кидайтесь на кого-то за вопрос.
Джонатон Нордквист

2
Он сформулировал это неоптимально. Я думаю, что он хотел сказать: «Помните, что вы можете запустить это irbи попробовать. Возможно, даже быстрее, чем отправка SO-вопроса, и отличная возможность проверить все в целом». Во всяком случае, я так это слышал.
user2066657 05

Ответы:


158

Да: !~работает нормально - вы, вероятно, думали, что это не так, потому что он отсутствует на странице документацииRegexp . Тем не менее, это работает:

irb(main):001:0> 'x' !~ /x/
=> false
irb(main):002:0> 'x' !~ /y/
=> true

9
!~задокументирован в разделе " Объект" .
Tonči D.

4
В Ruby 2.4 также есть несколько более приятный синтаксис RegExp#match?, который вы легко можете отрицать. Согласно примечаниям к выпуску , он выделяет даже меньше, чем!~
panmari

6

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

Это решение нижнего уровня. Так преобразовать регулярные выражения не всегда просто. С другой стороны, это решение не зависит от языка программирования верхнего уровня;)
Константин

0

Вернувшись в Perl, 'foobar' !~ /bar/ было прекрасно проверить, что строка не содержит «bar».

В Ruby, особенно с современным руководством по стилю, я думаю, что более явное решение более традиционное и легкое для понимания:

input = 'foobar'

do_something unless input.match?(/bar/) 

needs_bar = !input.match?(/bar/)

Тем не менее, я думаю, было бы здорово, если бы был .no_match?метод.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.