Regex nicht Operator

106

Gibt es in Regexes einen NOT-Operator? Wie in dieser Zeichenfolge:"(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"

Ich möchte alle löschen, \([0-9a-zA-z _\.\-:]*\)aber nicht den, in dem es ein Jahr ist : (2001).

Was der reguläre Ausdruck zurückgeben soll, muss also sein : (2001) name.

HINWEIS: so etwas \((?![\d]){4}[0-9a-zA-z _\.\-:]*\)funktioniert bei mir nicht (das (20019)passt irgendwie auch zusammen ...)

Sonnenhut
quelle
1
Es gibt einen String wie oben und ich möchte ihn neu formulieren, dass das Ergebnis des regulären Ausdrucks ist : (2001) name.
Sonnenhut

Antworten:

108

Nein, es gibt keinen direkten Nicht-Operator. Zumindest nicht so, wie Sie es sich erhoffen.

Sie können jedoch einen negativen Lookahead mit einer Breite von Null verwenden:

\((?!2001)[0-9a-zA-z _\.\-:]*\)

Der (?!...)Teil bedeutet "nur übereinstimmen, wenn der folgende Text (daher: Lookahead) nicht mit diesem übereinstimmt (daher: negativ). Er verbraucht jedoch nicht die Zeichen, mit denen er übereinstimmt (daher: Breite Null).

Es gibt tatsächlich 4 Kombinationen von Lookarounds mit 2 Achsen:

  • lookbehind / lookahead: Gibt an, ob die Zeichen vor oder nach dem Punkt berücksichtigt werden
  • Positiv / Negativ: Gibt an, ob die Zeichen müssen übereinstimmen oder nicht müssen übereinstimmen.
Joachim Sauer
quelle
Danke das ?! ist das, was ich auch vorgeschlagen habe, aber trotzdem, wenn ich es benutze, \((?![\d]{4})[0-9a-zA-z _\.\-:]+\)ist es noch (20019)drin
Sonnenhut
Bei der Bearbeitung Ihrer Frage haben Sie das {4} Äußere des Lookaheads und in diesem Kommentar das Innere des Lookaheads platziert : Welches haben Sie versucht? Außerdem: Wenn Sie (20019)übereinstimmen möchten , müssen Sie das \) Innere Ihres Lookaheads hinzufügen :\((?![\d]{4}\))[0-9a-zA-z _\.\-:]+\)
Joachim Sauer
Mit dem regulären Ausdruck in Ihrem Kommentar funktioniert es. Aber ich verstehe das nicht ... Ich verstehe nicht, warum Sie dem folgenden Teil entkommen. \((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)Dann gibt es eine Klammer, die nicht geschlossen ist, nicht wahr?
Sonnenhut
Ich entkomme der schließenden Klammer, )weil ich dem wörtlichen Zeichen entsprechen möchte )(genau wie Sie es am Anfang und am Ende Ihrer Regex tun!). Dann , nachdem ich , dass abgestimmt, I die Vorgriffs - Ende durch eine unescaped verwenden ).
Joachim Sauer
Verstanden. Ich war ein bisschen verwirrt von all diesen Charakteren. Danke dir.
Sonnenhut
179

Nicht ganz, obwohl Sie im Allgemeinen eine Problemumgehung für eines der Formulare verwenden können

  • [^abc], das ist Zeichen für Zeichen nicht aoder boder c,
  • oder negativer Lookahead : a(?!b), agefolgt von nichtb
  • oder negativer Lookbehind : (?<!a)b, dem bnicht vorausgegangen ista
Johan Sjöberg
quelle
Ja, ich denke, negativer Rückblick ist (? <! A) b - Referenz: regulär-
expressions.info
7
Aber [^abc]sollte bedeuten nicht aoder boder cnicht „nicht die Zeichenfolge abc“.
Regen