Czy wyrażenie regularne Rubiego ma w Perlu operator niedopasowania, taki jak „! ~”?

92

Chcę tylko wiedzieć, czy wyrażenie regularne ruby ​​ma operator dopasowania, tak jak !~w perlu. Uważam, że jest to niewygodne w użyciu (?!xxx)lub (?<!xxxx)ponieważ w części nie można używać wzorców wyrażeń regularnych xxx.

user1793091
źródło
8
Wszystko, co musiałeś zrobić, to odpalić irbi spróbować. Prawdopodobnie byłby szybszy niż wysłanie pytania SO.
Mark Thomas,
33
Ale nie szybciej niż
wygooglowanie ``
3
Eksperymentowałem przez chwilę, zanim utknąłem, przeszukałem go i znalazłem tę odpowiedź (która zadziałała). Nigdy nie rzucaj się na kogoś za zadanie pytania.
Jonathon Nordquist
2
Sformułował to nieoptymalnie. Myślę, że miał na myśli to, że „pamiętaj, że możesz odpalić irbi spróbować. Prawdopodobnie nawet szybciej niż wysłanie pytania SO i świetna okazja do przetestowania wszystkiego w ogóle”. To jak ja usłyszałem to, w każdym razie.
user2066657

Odpowiedzi:

158

Tak: !~działa dobrze - prawdopodobnie pomyślałeś, że nie, ponieważ brakuje go na stronie dokumentacjiRegexp . Niemniej jednak działa:

irb(main):001:0> 'x' !~ /x/
=> false
irb(main):002:0> 'x' !~ /y/
=> true
Konrad Rudolph
źródło
9
!~jest udokumentowane w Object .
Tonči D.
4
W Ruby 2.4 jest też nieco ładniejsza składnia RegExp#match?, którą można łatwo zanegować. Według informacji o wydaniu , przydział jest jeszcze mniejszy niż!~
panmari
6

AFAIK (?! Xxx) jest obsługiwany:

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
calfzhou
źródło
To rozwiązanie niższego poziomu. Konwersja wyrażeń regularnych w ten sposób nie zawsze jest łatwa. Z drugiej strony to rozwiązanie nie zależy od języka programowania najwyższego poziomu;)
Konstantin
0

W perlu 'foobar' !~ /bar/doskonale było sprawdzić, czy łańcuch nie zawiera znaku „bar”.

W Rubim, szczególnie w przypadku przewodnika po nowoczesnym stylu, myślę, że bardziej jednoznaczne rozwiązanie jest bardziej konwencjonalne i łatwe do zrozumienia:

input = 'foobar'

do_something unless input.match?(/bar/) 

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

To powiedziawszy, myślę, że byłoby fajnie, gdyby istniała .no_match?metoda.

David Hempy
źródło