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"?
Antworten
Zu viele Anzeigen?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].
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.
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
.
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]
- See previous answers
- Weitere Antworten anzeigen
0 Stimmen
Verwandt: regex für den Abgleich von etwas, wenn es nicht von etwas anderem vorangestellt wird