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
.
92
irb
i spróbować. Prawdopodobnie byłby szybszy niż wysłanie pytania SO.irb
i 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.Odpowiedzi:
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
źródło
!~
jest udokumentowane w Object .RegExp#match?
, którą można łatwo zanegować. Według informacji o wydaniu , przydział jest jeszcze mniejszy niż!~
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
źródło
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.źródło