Чи має регулярний вираз Ruby оператор, що не відповідає типу "! ~" У Perl?


92

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


8
Все, що вам потрібно було зробити, - це розпалитись irbі спробувати. Можливо, це було б швидше, ніж розміщення запитання SO.
Марк Томас

33
Але не швидше, ніж погуглити "ruby not match" і знайти цю відповідь на SO;)
micapam

3
Я експериментував деякий час, перш ніж застрягти, погуглити і знайти цю відповідь (що спрацювало.). Ніколи не кидайте на когось запитання.
Джонатан Нордквіст,

2
Він сформулював це неоптимально. На мою думку, він мав на увазі сказати: "пам’ятайте, ви можете запустити irbі спробувати. Можливо, навіть швидше, ніж розміщення запитання SO та чудова можливість перевірити речі взагалі". Так я це все-таки почув.
user2066657

Відповіді:


156

Так: !~чудово працює - ви, мабуть, думали, що не буде, оскільки його немає на сторінці документаціїRegexp . Тим не менше, це працює:

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

8
!~задокументовано під Об'єктом .
Тончі Д.

3
З 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/було цілком приємно перевірити, що рядок не містить "бар".

У 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.