852 Stimmen

Wie negiert man ein bestimmtes Wort in einer Regex?

Ich weiß, dass ich eine Gruppe von Zeichen negieren kann wie in [^bar] aber ich brauche einen regulären Ausdruck, bei dem sich die Negation auf ein bestimmtes Wort bezieht - wie negiere ich also in meinem Beispiel ein tatsächliches bar und nicht "beliebige Zeichen in der Leiste"?

1039voto

Chris Van Opstal Punkte 34697

Eine gute Möglichkeit, dies zu tun, ist die Verwendung von negative Vorausschau :

^(?!.*bar).*$

Die negative Vorausschau-Konstruktion ist das Klammerpaar, wobei auf die öffnende Klammer ein Fragezeichen und ein Ausrufezeichen folgen. Innerhalb des Lookaheads [ist ein beliebiges Regex-Muster].

75voto

Bryan Oakley Punkte 337213

Wenn die Leistung nicht von größter Bedeutung ist, ist es oft einfacher, die Ergebnisse in einem zweiten Durchgang zu überprüfen und diejenigen zu überspringen, die mit den Wörtern übereinstimmen, die Sie verneinen wollen.

Reguläre Ausdrücke bedeuten in der Regel, dass Sie ohnehin Skripte oder andere Aufgaben mit geringer Leistung ausführen. Suchen Sie also eine Lösung, die leicht zu lesen, leicht zu verstehen und leicht zu pflegen ist.

73voto

Stéphane GRILLON Punkte 9794

Lösung:

^(?!.*STRING1|.*STRING2|.*STRING3).*$

xxxxxx OK

xxxSTRING1xxx KO (ist, ob es erwünscht ist)

xxxSTRING2xxx KO (ist, ob es erwünscht ist)

xxxSTRING3xxx KO (ist, ob es erwünscht ist)

58voto

Gumbo Punkte 617646

Sie könnten entweder eine negativer Vorausblick oder Rückblick :

^(?!.*?bar).*
^(.(?<!bar))*?$

Oder verwenden Sie nur die Grundlagen:

^(?:[^b]+|b(?:$|[^a]|a(?:$|[^r])))*$

Diese passen alle zu allem, was nicht bar .

44voto

JAB Punkte 19937

Die folgende Regex wird das tun, was Sie wollen (solange negative lookbehinds und lookaheads unterstützt werden), die Dinge richtig übereinstimmen; das einzige Problem ist, dass es einzelne Zeichen übereinstimmt (d.h. jede Übereinstimmung ist ein einzelnes Zeichen und nicht alle Zeichen zwischen zwei aufeinanderfolgenden "bar "s), was möglicherweise zu einem Potenzial für hohen Overhead, wenn Sie mit sehr langen Zeichenfolgen arbeiten.

b(?!ar)|(?<!b)a|a(?!r)|(?<!ba)r|[^bar]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X