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.