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


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.

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

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