2 Stimmen

RegEx in JS, um 3 aufeinanderfolgende identische Zeichen zu finden

Wie findet man eine Sequenz von 3 Zeichen, 'abb' ist gültig, während 'abbb' nicht gültig ist, in JS mit Regex (könnte Alphabete, Zahlen und Nicht-Alpha-Zahlen sein).

Diese Frage ist eine Variation der Frage, die ich hier gestellt habe: Wie man diese Regex für Javascript kombiniert .

Das ist falsch: /(^([0-9a-zA-Z]|[^0-9a-zA-Z]))\1\1/ Was ist also der richtige Weg, um dies zu tun?

6voto

Martin Ender Punkte 41959

Das hängt davon ab, was Sie tatsächlich meinen. Wenn Sie nur drei nicht identische Zeichen abgleichen wollen (d.h. wenn abb für Sie gültig ist), können Sie diese negative Vorausschau verwenden:

(?!(.)\1\1).{3}

Zunächst wird festgestellt, dass an der aktuellen Stelle nicht dreimal das gleiche Zeichen folgt. Dann werden diese drei Zeichen verglichen.

Wenn Sie wirklich 3 verschiedene Zeichen zuordnen möchten (nur Dinge wie abc ), wird es ein wenig komplizierter. Verwenden Sie stattdessen diese beiden negativen Lookaheads:

(.)(?!\1)(.)(?!\1|\2).

Triff zuerst ein Zeichen. Dann stellen wir fest, dass diesem nicht das gleiche Zeichen folgt. Wenn ja, wird ein weiteres Zeichen gefunden. Dann stellen wir fest, dass auf dieses weder das erste noch das zweite Zeichen folgt. Dann passen wir ein drittes Zeichen an.

Beachten Sie, dass diese negativen Vorausschauwerte ( (?!...) ) verbrauchen keine Zeichen. Deshalb nennt man sie auch Lookaheads. Sie prüfen nur, was als nächstes kommt (oder in diesem Fall, was ist no kommt als nächstes) und dann macht die Regex da weiter, wo sie aufgehört hat. Hier ist ein guter Leitfaden.

Beachten Sie auch, dass dies auf alles außer Zeilenumbrüchen passt, oder wirklich alles wenn Sie die Option DOTALL oder SINGLELINE verwenden. Da Sie JavaScript verwenden, können Sie die Option einfach durch Anhängen von s nach das abschließende Begrenzungszeichen des Regexes. Wenn Sie (aus irgendeinem Grund) diese Option nicht verwenden möchten, ersetzen Sie die Option . s von [\s\S] (dies entspricht immer einem beliebigen Zeichen).

Aktualisierung:

Nach der Klärung in den Kommentaren wurde mir klar, dass Sie nicht wollen, dass finden. drei nicht identische Zeichen, aber stattdessen wollen Sie behaupten. dass Ihr String nicht enthalten drei identische (und aufeinanderfolgende) Zeichen.

Dies ist etwas einfacher und kommt Ihrer früheren Frage näher, da es nur eine negative Vorausschau erfordert. Wir suchen in der Zeichenkette von Anfang an nach drei aufeinanderfolgenden identischen Zeichen. Da wir aber sicherstellen wollen, dass diese no existieren, verpacken wir dies in eine negative Vorausschau:

^(?!.*(.)\1\1)

Die Vorausschau ist am Anfang der Zeichenkette verankert, so dass dies die einzige Stelle ist, an der wir nachschauen werden. Das Muster im Lookahead versucht dann, drei identische Zeichen ab einer beliebigen Position in der Zeichenkette zu finden (aufgrund der .* ; die identischen Zeichen werden auf die gleiche Weise wie in Ihrer vorherigen Frage abgeglichen). Wenn das Muster diese Zeichen findet, schlägt die negative Vorausschau fehl, und die Zeichenfolge ist ungültig. Wenn keine drei identischen Zeichen gefunden werden können, wird das innere Muster niemals übereinstimmen, so dass der negative Lookahead erfolgreich sein wird.

0voto

Ωmega Punkte 40046

Um nicht-drei-identische Zeichen zu finden, verwenden Sie das Regex-Muster

([\s\S])(?!\1\1)[\s\S]{2}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X