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.