2010-09-23 10 views
11

Próbuję dowiedzieć się, jak napisać wyrażenie regularne, które może wykryć, jeśli w ciągu znaków, każda postać jest powtarzana więcej niż pięć razy z rzędu? Na przykład nie wykryłoby "cześć", ale wykryłoby "helloooooooooo".Regex za wykrycie tej samej postaci więcej niż pięć razy?

Wszelkie pomysły?

Edit: Niestety, aby wyjaśnić, muszę go wykryć postać samo powtarzany więcej niż pięć razy, a nie dowolny ciąg pięciu znaków. I potrzebuję go również do pracy z jakimkolwiek czarterem, nie tylko "o" jak w moim przykładzie. ". {5,}" nie jest dobre, ponieważ wykrywa tylko sekwencję pięciu znaków, a nie tę samą.

+0

patrz także możliwy duplikat [Wyrażenie regularne, aby dopasować dowolną postać powtarzaną więcej niż 10 razy] (http://stackoverflow.com/questions/1660694/regular-expression-to-match-any-character-being-repeated -więcej niż 10 razy) – Bergi

Odpowiedz

23

to powinien to zrobić

(\w)\1{5,} 
  • (\w) dowolny znak i umieścić go w pierwszym grupa
  • \1{5,} sprawdź, czy pierwsza grupa pasuje co najmniej 5 razy.

Zastosowanie:

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

Masz całkowitą rację, poprawiłem odpowiedź na więcej niż 5 powtórzeń. –

+0

Doskonały, dzięki! –

+0

+1 za naprawienie. – eldarerathis

11

Korekta, powinien być (.)\1{5,}, wierzę. Mój błąd. To dostaje:

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

Można również ograniczyć go do listów za pomocą (\w)\1{5,} lub ([a-zA-Z])\1{5,}

+0

Spowoduje to również dopasowanie * "hello" *, * "do widzenia" * lub dowolny inny ciąg dłuższy niż cztery znaki. – LukeH

+0

@LukeH: Zdecydowanie rozstawione. Dzięki. – eldarerathis

+0

To zadziała, ale zauważ, że "." dopasowuje każdy pojedynczy znak z wyjątkiem Linebreaks. Obejmuje to whitepace, numery itp. – Powertieke

0

Można użyć wyrażenia regularnego:

(.)\1{5,} 

Objaśnienie:

  • .: Meta char, który pasuje do każdego char.
  • (): Są używane do grupowania i pamiętając dopasowany pojedynczy znak.
  • \1: powrót do pojedynczego kształtu , który został zapamiętany w poprzednim kroku .
  • {5,}: kwantyfikatorów do 5 lub więcej

w PHP i można go używać jako:

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

wyjściowa:

Found repeating char o in helloooooooooo 
1

Tak.

(.)\1+ 

Spowoduje to dopasowanie powtarzających się sekwencji dowolnego znaku.

Przegląda zawartość pierwszego zestawu nawiasów. (więc jeśli masz bardziej złożone wyrażenie regularne, musisz dostosować je do poprawnego numeru, aby odebrać właściwy zestaw nawiasów).

Jeśli trzeba określić, powiedzieć więcej niż trzy z nich:

(.)\1{3,} 

Składnia \ 1 jest dość mocny - np Można również użyć go w innym miejscu regex, aby szukać tego samego znaku występującego w różnych miejscach w ciągu wyszukiwania.

Powiązane problemy