2017-03-27 1 views
0

Ich versuche, einen regulären Ausdruck zu erstellen, der ein Wort erkennen wird, das ein Zeichen 3 oder mehrmals im gesamten Wort wiederholt. Ich habe diese zahlreichen Möglichkeiten ausprobiert und ich kann nicht scheinen, die richtige Ausgabe zu bekommen.PHP Regex erkennen wiederholten Zeichen in einem Wort

+1

Ein "Wort"? Was ist Ihre Eingabe und erwartete Ausgabe? Hinweis ''/(.) \ 1 {3}/'' entspricht 4 identischen Zeichen am Ende. Um 3 identische aufeinanderfolgende Zeichen zu finden, benötigen Sie ''/ (.) \ 1 {2} /''. Probieren Sie '(\ w) \ 1 {2}', wenn Sie nur Wortzeichen (Buchstaben, Ziffern oder '_') suchen möchten. –

+0

Müssen die 3 Zeichen zusammenhängend sein? –

+0

Wenn du drei _oder mehr Male_ willst, musst du '{3,}' anstelle von '{3}' verwenden (das entspricht nur drei genauen Zeiten) –

Antwort

0

diese regex Versuchen Sie stattdessen

(preg_match('/(.)\1{2,}/', $repeater)) 

Dies sollte drei oder mehrere Male entsprechen, siehe Beispiel hier http://regexr.com/3fk80

+0

Dies entspricht 3 gleichen ** aufeinanderfolgenden ** Zeichen, kein Wort * * enthält ** 3 gleiche Zeichen. – Aloso

2

Wenn Sie zusammenhängend sein nicht Buchstaben benötigen, können Sie es mit diesem Muster tun können:

\b\w*?(\w)\w*?\1\w*?\1\w* 

sonst sollte dieses genügen:

\b\w*?(\w)\1{2}\w* 
+0

Ich fand fast die gleiche Regex, nur ein bisschen länger. – Aloso

0

Genau genommen sind reguläre Ausdrücke, die \1, \2, ... Dinge enthalten, keine mathematischen regulären Ausdrücke und der Scanner, der sie analysiert, ist nicht effizient in dem Sinne, dass sie sich selbst so modifizieren muss, dass sie die akzeptierte Gruppe enthält wird verwendet, um die entdeckte Zeichenkette zu vergleichen, und im Falle eines Fehlers muss sie für die Länge der übereinstimmenden Gruppe zurückverfolgen.

Die kanonische Weise einen echten regulären Ausdruck zum Ausdruck bringen, das Wortzeichen drei- oder mehrmals

(A{3,}|B{3,}|C{3,}|...|Z{3,}|a{3,}|b{3,}|...|z{3,}) 

und es gibt keine Assoziativität des Betreibers ist {3,} zu einer Gruppe in der Lage sein, wie Sie in Ihrer Frage gezeigt wiederholt akzeptiert .

Für die pedantisch sollte der reine reguläre Ausdruck sein:

(AAAA*|BBBB*|CCCC*|...|ZZZZ*|aaaa*|bbbb*|cccc*|...|zzzz*) 

erneut, dieses Mal, können Sie die Tatsache nutzen, dass AAAA* so schnell angepasst ist als drei A s gefunden werden, so wäre es gültig sein auch die Regex:

AAA|BBB|CCC|...|ZZZ|aaa|bbb|ccc|...|zzz 

aber die erste Version können Sie die \1 Gruppe erfassen, die die eigentliche Match-Sequenz begrenzt.

Dieser Ansatz wird länger zu schreiben sein, ist aber weitaus effizienter beim Analysieren der Datenkette, da er überhaupt keine Rückverfolgung hat und jedes Zeichen nur einmal besucht.

Verwandte Themen