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

89

*, ?, +Alle Zeichen bedeuten, dass sie mit diesem Zeichen übereinstimmen. Welcher Charakter bedeutet "passt nicht dazu"? Beispiele würden helfen.

Klicken Sie auf Upvote
quelle
Für eine Lösung bezüglich der Nichtübereinstimmung
null

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 .

Paolo Stefan
quelle
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.

Amadan
quelle
^((?!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

diEcho
quelle
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>
Ignacio Vazquez-Abrams
quelle
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