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.

War es hilfreich?

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üssen

Eine 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

Wie Muster entsprechen, außer in Situationen, s1, s2, s3

Wie ein Muster entsprechen, es sei denn ...

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.

Muster - re

str.split(/re/g) 

wird alles außer dem Muster zurück.

Test hier

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 ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top