Regex – wie man alles außer einem bestimmten Muster anpasst

Wie schreibe ich eine Regex, die zu einer beliebigen Zeichenfolge passt, die einem bestimmten Muster nicht entspricht? Ich bin mit einer Situation konfrontiert, in der ich ein (A und ~ B) Muster zuordnen muss.

Solutions Collecting From Web of "Regex – wie man alles außer einem bestimmten Muster anpasst"

Sie könnten eine Look-Ahead-Assertion verwenden:

(?!999)\d{3} 

In diesem Beispiel stimmen drei andere Ziffern als 999 überein.


Wenn Sie jedoch keine reguläre Ausdrucksimplementierung mit dieser function haben (siehe Vergleich von Regular Expression Flavors ), müssen Sie wahrscheinlich einen regulären Ausdruck mit den grundlegenden functionen selbst erstellen.

Ein kompatibler regulärer Ausdruck mit nur der grundlegenden Syntax wäre:

 [0-8]\d\d|\d[0-8]\d|\d\d[0-8] 

Dies entspricht auch einer dreistelligen Sequenz, die nicht 999 .

Wenn Sie ein Wort A in einer Zeichenfolge abgleichen und kein Wort B finden möchten. Beispiel: Wenn Sie einen Text haben:

 1. I have a two pets - dog and a cat 2. I have a pet - dog 

Wenn Sie nach Textzeilen suchen, die einen Hund für ein Haustier haben und KEINE Katze haben , können Sie diesen regulären Ausdruck verwenden:

 ^(?=.*?\bdog\b)((?!cat).)*$ 

Es wird nur die zweite Zeile finden:

 2. I have a pet - dog 

Stimmen Sie mit dem Muster überein und verwenden Sie die Hostsprache, um das boolesche Ergebnis der Übereinstimmung zu invertieren. Dies wird viel lesbarer und wartbarer sein.

nicht, diese alte Frage wieder auferstehen lassen, weil sie eine einfache Lösung hatte, die nicht erwähnt wurde. (Du hast deine Frage gefunden, als du nach einer Regex-Kopfgeld-Quest geforscht hast.)

Ich bin mit einer Situation konfrontiert, in der ich ein (A und ~ B) Muster zuordnen muss.

Der grundlegende Regex dafür ist erschreckend einfach: B|(A)

Sie ignorieren nur die gesamten Übereinstimmungen und untersuchen die Captures der Gruppe 1, die A enthalten.

Ein Beispiel (mit allen Disclaimern zum Parsen von HTML in Regex): A ist Ziffern, B ist Ziffern innerhalb

Die Regex: |(\d+)

Demo (schau auf Gruppe 1 im unteren rechten Bereich)

Referenz

Wie man Muster anpasst, außer in den Situationen s1, s2, s3

Wie man ein Muster anpasst, wenn ...

Das Komplement einer regulären Sprache ist ebenfalls eine reguläre Sprache, aber um es zu konstruieren, müssen Sie das DFA für die reguläre Sprache erstellen und jede gültige Statusänderung zu einem Fehler machen. Sehen Sie dies für ein Beispiel. Was die Seite nicht sagt ist, dass sie /(ac|bd)/ in /(a[^c]?|b[^d]?|[^ab])/ . Die Konvertierung von einem DFA zurück in einen regulären Ausdruck ist nicht trivial. Es ist einfacher, wenn Sie den regulären Ausdruck unverändert verwenden und die Semantik im Code ändern können, wie zuvor vorgeschlagen.

Muster – re

 str.split(/re/g) 

gibt alles außer dem Muster zurück.

Testen Sie hier

Meine Antwort hier könnte auch Ihr Problem lösen:

https://stackoverflow.com/a/27967674/543814

  • Anstelle von Ersetzen würden Sie Match verwenden.
  • Anstelle der Gruppe $1 würden Sie die Gruppe $2 lesen.
  • Group $2 wurde dort nicht erfasst, was Sie vermeiden würden.

Beispiel:

Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");

Die erste Erfassungsgruppe gibt das Muster an, das Sie vermeiden möchten. Die letzte einfangende Gruppe erfasst alles andere. Lies einfach diese Gruppe aus, $2 .

 (B)|(A) 

dann benutze, was Gruppe 2 erfasst …