Który operator wyrażenia regularnego oznacza „Nie” pasuje do tego znaku?

89

*, ?, +wszystkie znaki oznaczają dopasowanie do tego znaku. Który znak oznacza „nie” pasuje do tego? Przykłady by pomogły.

Kliknij opcję Głos za
źródło
Rozwiązanie dotyczące niedopasowania słowa - zobacz tutaj stackoverflow.com/questions/406230
null

Odpowiedzi:

88

Możesz użyć zanegowanych klas znaków, aby wykluczyć określone znaki: na przykład [^abcde]dopasuje wszystko oprócz znaków a, b, c, d, e.

Zamiast podawać wszystkie znaki dosłownie, możesz używać skrótów wewnątrz klas znaków: [\w](małe litery) dopasują dowolny „znak słowa” (litera, cyfry i podkreślenie), [\W](wielkie litery) dopasują wszystko inne niż znaki słowa; podobnie, [\d]dopasuje cyfry 0-9, podczas gdy [\D]dopasuje wszystko oprócz cyfr 0-9 i tak dalej.

Jeśli używasz PHP, możesz zapoznać się z dokumentacją klas znaków wyrażeń regularnych .

Paolo Stefan
źródło
80

Istnieją dwa sposoby na powiedzenie „nie pasuje”: zakresy znaków i ujemne wybieganie w przód / w tył o zerowej szerokości.

Były: nie pasują a, b, club 0:[^a-c0]

Ten ostatni: dopasuj dowolny trzyliterowy ciąg z wyjątkiem fooi bar:

(?!foo|bar).{3}

lub

.{3}(?<!foo|bar)

Ponadto korekta dla Ciebie: *, ?a +nie faktycznie pasuje do niczego. Są operatorami powtórzeń i zawsze następują po operatorze dopasowania. Zatem a+środki dopasować jedną lub więcej a, [a-c0]+środki dopasować jedną lub więcej a, b, club 0, gdy [^a-c0]+będzie pasować do jednego lub więcej z niczego, co nie było a, b, club 0.

Amadan
źródło
^((?!foo).)+$Dopasuj dowolną linię niezawierającą foo regex101.com/r/z6a65l/4
Levi Baguley
48

[^] (w [] ) jest negacją w wyrażeniu regularnym, podczas gdy ^jest „początkiem łańcucha”

[^a-z] dopasowuje dowolny pojedynczy znak, który nie jest od „a” do „z”

^[a-z] oznacza, że ​​ciąg zaczyna się od „a” do „z”

Odniesienie

diEcho
źródło
8

^ używane na początku zakresu znaków lub ujemnych potwierdzeń lookahead / lookbehind.

>>> re.match('[^f]', 'foo')
>>> re.match('[^f]', 'bar')
<_sre.SRE_Match object at 0x7f8b102ad6b0>
>>> re.match('(?!foo)...', 'foo')
>>> re.match('(?!foo)...', 'bar')
<_sre.SRE_Match object at 0x7f8b0fe70780>
Ignacio Vazquez-Abrams
źródło
Czy musisz użyć ?!w ostatnich 2 przykładach, czy możesz po prostu użyć !samego? Co ?tam robi?
Kliknij przycisk „Za głosowaniem”
Python potrzebuje ?, aby powiedzieć, że jest to rozszerzenie. Inne silniki wyrażeń regularnych mogą mieć własne reguły.
Ignacio Vazquez-Abrams
@Click: To całkiem standardowe. regular-expressions.info/refadv.html , również większość podręczników do silników regexp mówi to samo.
Amadan