Ich habe zum Beispiel eine Regex (ma|(t){1})
. Es passt ma
und t
und passt nicht bla
.
Ich mag die Regex negieren, so muss es passen bla
und nicht ma
und t
, von etwas zu diesem regex Zugabe . Ich weiß, dass ich schreiben kann bla
, der eigentliche reguläre Ausdruck ist jedoch komplexer.
regex
regex-negation
IAdapter
quelle
quelle
{1}
ist völlig nutzlos. (Wenn Sie denken, dass es einen Wert bietet, warum schreiben Sie nicht((m{1}a{1}){1}|(t){1}){1}
?)Antworten:
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 übereinstimmt. Einige Geschmacksrichtungen unterstützen Behauptungen; Einige schränken das Aussehen usw. ein.
Links zu regulär-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 lernen möchten, wie Sie Lookarounds verwenden können (Verschachteln, Erfassen usw.):
quelle
grep
.Pattern.compile("(?!(a.*b))").matcher("xab").matches()
sollte seintrue
, richtig?Angenommen, Sie möchten nur Zeichenfolgen verbieten, die vollständig mit dem regulären Ausdruck übereinstimmen (dh in
mmbla
Ordnung sind, abermm
nicht), dann möchten Sie Folgendes:(?!(?:m{2}|t)$)
ist ein negativer Lookahead ; es heißt "ab der aktuellen Position sind die nächsten Zeichen nichtmm
odert
, gefolgt vom Ende der Zeichenfolge." Der Startanker (^
) am Anfang stellt sicher, dass der Lookahead am Anfang der Zeichenfolge angewendet wird. Wenn dies erfolgreich ist,.*
geht der voran und verbraucht die Zeichenfolge.Zu Ihrer Information, wenn Sie Javas
matches()
Methode verwenden, brauchen Sie das^
und das Finale nicht wirklich$
, aber sie schaden nicht. Das$
Innere des Lookaheads ist jedoch erforderlich.quelle
.*
am Ende Ihrer Regex hinzufügen müssen, da sonst jede Zeichenfolge abgelehnt wird.$
Innere des negativen Lookaheads UND das.*
am Ende sind beide kritische Bits. Wie immer bei REs ist eine Reihe von Unit-Tests absolut entscheidend, um die richtigen Ergebnisse zu erzielen. Diese Antwort ist 100% richtig.Dies gilt für den angegebenen regulären Ausdruck.
Das \ b soll die Wortgrenze finden.
Der positive Blick nach vorne (? = \ w) ist hier, um Leerzeichen zu vermeiden.
Der negative Blick nach vorne auf den ursprünglichen regulären Ausdruck besteht darin, Übereinstimmungen zu verhindern.
und schließlich soll (\ w *) alle verbleibenden Wörter erfassen.
Die Gruppe, die die Wörter enthält, ist Gruppe 3.
Das einfache (?! Muster) funktioniert nicht, da eine Unterzeichenfolge mit
dem einfachen ^ (?! (?: m {2} | t) $) übereinstimmt . * $ wird funktioniert nicht, da die Granularität volle Linien sind
quelle