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 ...)
(2001) name
.Antworten:
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:
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:
quelle
\((?![\d]{4})[0-9a-zA-z _\.\-:]+\)
ist es noch(20019)
drin{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 _\.\-:]+\)
\((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)
Dann gibt es eine Klammer, die nicht geschlossen ist, nicht wahr?)
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)
.Nicht ganz, obwohl Sie im Allgemeinen eine Problemumgehung für eines der Formulare verwenden können
[^abc]
, das ist Zeichen für Zeichen nichta
oderb
oderc
,a(?!b)
,a
gefolgt von nichtb
(?<!a)b
, demb
nicht vorausgegangen ista
quelle
[^abc]
sollte bedeuten nichta
oderb
oderc
nicht „nicht die Zeichenfolgeabc
“.