2010-09-23 14 views
11

Sto cercando di capire come scrivere una regex in grado di rilevare se nella mia stringa, ogni carattere viene ripetuto più di cinque volte consecutivamente? Ad esempio non rileverà "ciao", ma rileverà "helloooooooooo".Regex per rilevare lo stesso personaggio più di cinque volte?

Qualche idea?

Edit: Ci dispiace, per chiarire, ho bisogno di rilevare il carattere stessa ripetuto più di cinque volte, non una qualsiasi sequenza di cinque caratteri. E ho anche bisogno che funzioni con qualsiasi carta, non solo "o" come nel mio esempio. ". {5,}" non va bene perché rileva solo una sequenza di cinque caratteri, non lo stesso carattere.

+0

vedere anche possibili duplicati di [Espressione regolare per far corrispondere qualsiasi carattere ripetuto più di 10 volte] (http://stackoverflow.com/questions/1660694/regular-expression-to-match-any-character-being-repeated -more-than-10-times) – Bergi

risposta

23

Questo dovrebbe farlo

(\w)\1{5,} 
  • (\w) Trova ogni personaggio e metterlo nel primo gruppo
  • \1{5,} verificare che il primo gruppo corrisponda almeno 5 volte.

Usage:

$input = 'helloooooooooo'; 
if (preg_match('/(\w)\1{5,}/', $input)) { 
# Successful match 
} else { 
# Match attempt failed 
} 
+0

Hai perfettamente ragione, ho risolto la mia risposta per abbinare solo più di 5 ripetizioni. –

+0

Perfetto, grazie! –

+0

+1 per ripararlo. – eldarerathis

11

Correzione, dovrebbe essere (.)\1{5,}, credo. Errore mio. In questo modo si ottiene:

(.) #Any character 
\1 #The character captured by (.) 
{5,} #At least 5 more repetitions (total of at least 6) 

Si può anche limitare a lettere utilizzando (\w)\1{5,} o ([a-zA-Z])\1{5,}

+0

Corrisponde anche a * "ciao" *, * "addio" * o qualsiasi altra stringa più lunga di quattro caratteri. – LukeH

+0

@LukeH: decisamente distanziati. Grazie. – eldarerathis

+0

Funzionerà, ma nota che "." corrisponde a ogni singolo carattere tranne i Linebreak. Questo include spazio bianco, numeri, ecc. – Powertieke

0

È possibile utilizzare l'espressione regolare:

(.)\1{5,} 

Spiegazione:

  • .: char Meta che corrisponde a qualsiasi char.
  • (): sono utilizzati per il raggruppamento e ricordando il singolo carattere corrispondente.
  • \1: riferimento posteriore al singolo char che è stato memorizzato nel passaggio precedente.
  • {5,}: Quantificatore per 5 o più

e in PHP è possibile utilizzarlo come:

$input = 'helloooooooooo'; 
if(preg_match('/(.)\1{5,}/',$input,$matches)) { 
    echo "Found repeating char $matches[1] in $input"; 
} 

uscita:

Found repeating char o in helloooooooooo 
1

Yep.

(.)\1+ 

Questo corrisponderà a sequenze ripetute di qualsiasi carattere.

\1 esamina il contenuto della prima serie di parentesi. (quindi se si ha un'espressione regolare più complessa, è necessario regolarla sul numero corretto in modo che raccolga il corretto insieme di parentesi).

Se è necessario specificare, dicono più di tre di loro:

(.)\1{3,} 

Il \ 1 sintassi è abbastanza potente - ad esempio, è anche possibile utilizzare altrove nella vostra regex per cercare lo stesso personaggio che appare in diversi punti della stringa di ricerca.

Problemi correlati