Welcher Operator für reguläre Ausdrücke bedeutet "Nicht mit diesem Zeichen übereinstimmen"?


Antworten:


88

Sie können negierte Zeichenklassen verwenden, um bestimmte Zeichen auszuschließen: Sie [^abcde]stimmen beispielsweise mit allen Zeichen außer a, b, c, d, e überein.

Anstatt alle Zeichen wörtlich anzugeben, können Sie Kurzzeichen in Zeichenklassen verwenden: [\w](Kleinbuchstaben) stimmen mit jedem "Wortzeichen" (Buchstaben, Zahlen und Unterstrich) [\W]überein , (Großbuchstaben) stimmen mit allen anderen als Wortzeichen überein; In ähnlicher Weise [\d]werden die 0-9-Stellen [\D]übereinstimmen, während alles andere als die 0-9-Stellen übereinstimmen, und so weiter.

Wenn Sie PHP verwenden, können Sie sich die Dokumentation zu Regex-Zeichenklassen ansehen .


80

Es gibt zwei Möglichkeiten, um "Nicht übereinstimmen" zu sagen: Zeichenbereiche und negativer Lookahead / Lookbehind mit einer Breite von Null.

Die ehemalige: nicht übereinstimmen a, b, coder 0:[^a-c0]

Letzteres: Entspricht einer beliebigen dreistelligen Zeichenfolge mit Ausnahme von foound bar:

(?!foo|bar).{3}

oder

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

Auch eine Korrektur für Sie: *, ?und +nicht wirklich alles passen. Sie sind Wiederholungsoperatoren und folgen immer einem übereinstimmenden Operator. So a+eine oder mehrere der Mittel entsprechen a, [a-c0]+Mittel entsprechen einem oder mehreren der a, b, coder 0, während [^a-c0]+würde man erreichen oder mehr von irgendetwas , das war nicht a, b, coder 0.


^((?!foo).)+$Passen Sie
Levi Baguley

48

[^] (innerhalb von [] ) ist Negation im regulären Ausdruck, während ^"Beginn der Zeichenfolge" ist.

[^a-z] Entspricht einem einzelnen Zeichen, das nicht von "a" bis "z" reicht.

^[a-z] bedeutet, dass die Zeichenfolge mit "a" bis "z" beginnt

Referenz


8

^ Wird am Anfang eines Zeichenbereichs oder bei negativen Lookahead / Lookbehind-Behauptungen verwendet.

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

Müssen Sie ?!in den letzten 2 Beispielen verwenden oder können Sie nur !für sich selbst verwenden? Was macht ?da?
Klicken Sie auf Upvote

Python benötigt das, ?um zu erkennen, dass es sich um eine Erweiterung handelt. Andere Regex-Engines haben möglicherweise ihre eigenen Regeln.
Ignacio Vazquez-Abrams

@Click: Es ist ziemlich Standard. Regular-expressions.info/refadv.html , auch die meisten Regexp-Engine-Handbücher sagen dasselbe.
Amadan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.