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.
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.
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.):
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.
\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