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.
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.):
grep.
Pattern.compile("(?!(a.*b))").matcher("xab").matches()sollte sein true, richtig?
Angenommen, Sie möchten nur Zeichenfolgen verbieten, die vollständig mit dem regulären Ausdruck übereinstimmen (dh in mmblaOrdnung sind, aber mmnicht), dann möchten Sie Folgendes:
^(?!(?:m{2}|t)$).*$
(?!(?:m{2}|t)$)ist ein negativer Lookahead ; es heißt "ab der aktuellen Position sind die nächsten Zeichen nicht mm oder t, 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.
.*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.
\b(?=\w)(?!(ma|(t){1}))\b(\w*)
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
{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}?)