Wie schreibe ich einen regulären Ausdruck, der mit einer Zeichenfolge übereinstimmt, die einem bestimmten Muster nicht entspricht? Ich bin mit einer Situation konfrontiert, in der ich einem (A und ~ B) Muster entsprechen muss.
Wie schreibe ich einen regulären Ausdruck, der mit einer Zeichenfolge übereinstimmt, die einem bestimmten Muster nicht entspricht? Ich bin mit einer Situation konfrontiert, in der ich einem (A und ~ B) Muster entsprechen muss.
Antworten:
Sie könnten eine Vorausschau-Behauptung verwenden:
(?!999)\d{3}
Dieses Beispiel entspricht drei anderen Ziffern als 999.
Wenn Sie jedoch mit dieser Funktion keine Implementierung für reguläre Ausdrücke haben (siehe Vergleich der Geschmacksrichtungen für reguläre Ausdrücke ), müssen Sie wahrscheinlich selbst einen regulären Ausdruck mit den grundlegenden Funktionen erstellen.
Ein kompatibler regulärer Ausdruck mit nur grundlegender Syntax wäre:
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
Dies stimmt auch mit einer beliebigen dreistelligen Sequenz überein, die dies nicht ist 999.
Wenn Sie ein Wort A in einer Zeichenfolge und kein Wort B abgleichen 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 möchten, 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 gefunden:
2. I have a pet - dog
findstrBefehl. Es bietet nur einen winzigen Teil der Funktionen, die Sie in einem Regex-Tool erwarten. Lookahead gehört nicht dazu. (Ich habe gerade das findstr- Tag selbst hinzugefügt .)
Übereinstimmung mit dem Muster und Verwendung der Hostsprache, um das boolesche Ergebnis der Übereinstimmung zu invertieren. Dies ist viel besser lesbar und wartbar.
nicht, diese alte Frage wiederzubeleben, weil sie eine einfache Lösung hatte, die nicht erwähnt wurde. (Hab deine Frage gefunden, als du nach einer Regex-Kopfgeld-Quest gesucht hast .)
Ich bin mit einer Situation konfrontiert, in der ich einem (A und ~ B) Muster entsprechen muss.
Die grundlegende Regex dafür ist erschreckend einfach: B|(A)
Sie ignorieren einfach die Gesamtübereinstimmungen und untersuchen die Erfassungen der Gruppe 1, die A enthalten.
Ein Beispiel (mit allen Haftungsausschlüssen zum Parsen von HTML in Regex): A sind Ziffern, B sind Ziffern innerhalb <a tag
Die Regex: <a.*?<\/a>|(\d+)
Demo (siehe Gruppe 1 im unteren rechten Bereich)
Referenz
So passen Sie das Muster an, außer in Situationen s1, s2, s3
\ddurch fehl [[:digit:]]. In der ersten Referenz wird erwähnt, dass es spezifisch für Perl und PHP ist: "Es gibt eine Variation unter Verwendung der für Perl und PHP spezifischen Syntax, die dasselbe erreicht."
Die Ergänzung einer regulären Sprache ist auch eine reguläre Sprache. Um sie zu erstellen, müssen Sie jedoch den DFA für die reguläre Sprache erstellen und jede gültige Statusänderung in einen Fehler umwandeln. Sehen Sie dies für ein Beispiel. Was die Seite nicht sagt, ist, dass sie konvertiert /(ac|bd)/wurde /(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 wie zuvor vorgeschlagen ändern können.
replace str.replace(/re/g, ''), dann besteht keine Notwendigkeit, sie erneut zu verbinden. auch wenn du ein schönes schleppendes einwirfst? wie str.replace(/\re\s?/g, '')dann werden Sie alle doppelten Leerzeichen los, die Sie von etwas haben würden, das in der Mitte einer Zeichenfolge ersetzt wird
Meine Antwort hier könnte auch Ihr Problem lösen:
https://stackoverflow.com/a/27967674/543814
$1würden Sie Gruppe lesen $2.$2wurde 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 Erfassungsgruppe erfasst alles andere. Lesen Sie einfach diese Gruppe vor $2.
findstrTag entfernt, da alle Antworten hier nicht für das Tag gültig sind.