Regex - wie alles außer einem bestimmten Muster entsprechen
Frage
Wie kann ich einen regulären Ausdruck schreiben beliebige Zeichenfolge übereinstimmen, die nicht ein bestimmtes Muster nicht erfüllt? Ich bin mit einer Situation konfrontiert, wo ich ein (A und ~ B) Muster entsprechen.
Lösung
Sie könnten eine Vorgriff Behauptung verwenden:
(?!999)\d{3}
In diesem Beispiel entspricht drei Ziffern andere als 999
.
Aber wenn Sie nicht passieren eine reguläre Ausdruck Implementierung mit dieser Funktion haben (siehe Vergleich der Regular Expression Flavors ), werden Sie wahrscheinlich einen regulären Ausdruck mit den grundlegenden Funktionen auf eigene Faust.
bauen müssenEine kompatible reguläre Ausdrücke mit grundlegende Syntax wäre nur:
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
Dies passt auch alle drei Ziffern-Sequenz, die nicht 999
wird.
Andere Tipps
Wenn Sie ein Wort A in einer Zeichenfolge entsprechen und kein Wort B. Zum Beispiel zum Spiel: Wenn Sie einen Text ein:
1. I have a two pets - dog and a cat
2. I have a pet - dog
Wenn Sie Textzeilen suchen möchten, dass haben einen Hund für ein Haustier und NICHT Katze haben Sie diesen regulären Ausdruck verwenden können:
^(?=.*?\bdog\b)((?!cat).)*$
Es wird nur die zweite Zeile finden:
2. I have a pet - dog
Match gegen das Muster und verwendet, um die Host-Sprache das boolean Ergebnis des Spiels zu invertieren. Dies wird viel besser lesbar und wartbar sein.
notnot, wieder zu beleben diese alte Frage, weil es eine einfache Lösung hatte, die nicht erwähnt wurde. (Gefunden Ihre Frage, während einige der Forschung für eine regex Bounty Quest tun.)
Ich bin mit einer Situation konfrontiert, wo ich ein (A und ~ B) entsprechen Muster.
Der Grund regex hierfür ist erschreckend einfach: B|(A)
Sie ignorieren einfach die Gesamtspiele und untersuchen die Gruppe 1 erfasst, die A enthalten wird.
Ein Beispiel (mit all den Lizenzbestimmungen über HTML in regex Parsen): A sind Ziffern, B ist Ziffern innerhalb <a tag
Die Regex: <a.*?<\/a>|(\d+)
Demo (siehe Gruppe 1 in dem unteren rechten Fensterbereich)
Referenz
Die Ergänzung einer regulären Sprache ist auch eine reguläre Sprache, aber es zu konstruieren Sie die DFA für die reguläre Sprache und macht jede gültige Zustandsänderung in einen Fehler. Siehe dieses für ein Beispiel. Was hat die Seite nicht sagen, ist, dass es /(ac|bd)/
in /(a[^c]?|b[^d]?|[^ab])/
umgewandelt. Die Umwandlung von einem DFA zurück zu einem regulären Ausdruck ist nicht trivial. Es ist einfacher, wenn Sie den regulären Ausdruck unverändert und ändern Sie die Semantik in Code verwenden können, wie zuvor vorgeschlagen.
Meine Antwort hier könnte Ihr Problem löst auch:
https://stackoverflow.com/a/27967674/543814
- Statt ersetzen, würden Sie Spiel verwenden.
- Statt Gruppe
$1
, würden Sie Gruppe$2
lesen. - Gruppen
$2
wurde dort gemacht Nicht-Erfassung, die Sie würde vermeiden.
Beispiel:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
Die erste Erfassungsgruppe gibt das Muster, die Sie vermeiden möchten. Die letzte Erfassungsgruppe fängt alles andere. Lesen Sie einfach diese Gruppe, $2
.
(B)|(A)
dann verwenden, was die Gruppe 2 Captures ...