webentwicklung-frage-antwort-db.com.de

Wie kann ich die ganze Regex negieren?

Ich habe eine Regex, zum Beispiel (ma|(t){1}). Es passt zu ma und t und nicht zu bla.

Ich möchte den Regex negieren, also muss er mit bla und nicht mit ma und t, übereinstimmen, indem ich diesem Regex etwas hinzufügt. Ich weiß, dass ich bla schreiben kann, der eigentliche Regex ist jedoch komplexer.

76
IAdapter

Verwenden Sie einen negativen Lookaround: (?!pattern)

Positive Lookarounds können verwendet werden, um zu bestätigen, dass ein Muster übereinstimmt. Negative Lookarounds sind das Gegenteil: Sie werden verwendet, um zu behaupten, dass ein Muster NICHT passt. Einige Geschmacksrichtungen unterstützen Behauptungen; Einige Einschränkungen für Lookbehind usw.

Links zu regular-expressions.info

Siehe auch

Mehr Beispiele

Dies sind Versuche, Regex-Lösungen für Spielzeugprobleme als Übungen zu finden; Sie sollten lehrreich sein, wenn Sie die verschiedenen Möglichkeiten kennenlernen möchten, mit denen Sie Lookarounds verwenden können (Verschachtelung, Verwendung zum Einfangen usw.):

82

Angenommen, Sie möchten nur Strings verbieten, die vollständig mit dem regulären Ausdruck übereinstimmen (d. H. mmbla ist in Ordnung, aber mm ist nicht zulässig).

^(?!(?:m{2}|t)$).*$

(?!(?:m{2}|t)$) ist ein negativer Lookahead ; es sagt "von der aktuellen Position ausgehend, sind die nächsten Zeichen nichtmm oder t, gefolgt vom Ende der Zeichenfolge." Der Startanker (^) am Anfang stellt sicher, dass der Lookahead am Anfang der Zeichenfolge angewendet wird. Wenn dies gelingt, geht der .* weiter und verbraucht den String.

Zu Ihrer Information, wenn Sie die matches()-Methode von Java verwenden, benötigen Sie den ^ und den abschließenden $ nicht wirklich, aber sie verursachen keinen Schaden. Der $ im Lookahead ist jedoch erforderlich.

42
Alan Moore
\b(?=\w)(?!(ma|(t){1}))\b(\w*)

dies ist für die gegebene Regex.
das\b soll die Wortgrenze finden.
Der positive Blick nach vorne (? =\w) dient dazu, Leerzeichen zu vermeiden.
Der negative Blick nach vorne gegenüber dem ursprünglichen Regex besteht darin, Übereinstimmungen zu verhindern.
und schließlich (\ w *) fangen alle Wörter ab, die noch übrig sind.
Die Gruppe, die die Wörter enthalten wird, ist Gruppe 3.
Das einfache (?! - Muster) funktioniert nicht, da alle untergeordneten Zeichenfolgen übereinstimmen
das einfache ^ (?! (?: m {2} | t) $). * $ funktioniert nicht, da die Granularität in ganzen Zeilen angegeben ist

0
Ofer Skulsky