2010-09-23 23 views
11

Estoy intentando averiguar cómo escribir una expresión regular que pueda detectar si en mi cadena, cualquier carácter se repite más de cinco veces consecutivas. Por ejemplo, no detectaría "hola", pero detectaría "helloooooooooo".Regex para detectar el mismo personaje más de cinco veces?

¿Alguna idea?

Editar: Lo siento, para aclarar, necesito que le permite detectar el carácter misma repite más de cinco veces, no cualquier secuencia de cinco caracteres. Y también necesito que funcione con cualquier carta, no solo con "o" como en mi ejemplo. ". {5,}" no sirve porque solo detecta cualquier secuencia de cinco caracteres, no del mismo personaje.

+0

ver también posible duplicado de [Expresión regular para que coincida con cualquier carácter que se repite más de 10 veces] (http://stackoverflow.com/questions/1660694/regular-expression-to-match-any-character-being-repeated -más de 10 veces) – Bergi

Respuesta

23

Esto debe hacerlo

(\w)\1{5,} 
  • (\w) partido de cualquier carácter y lo puso en el primer grupo
  • \1{5,} compruebe que el primer grupo coincida al menos 5 veces.

Uso:

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

Tiene toda la razón, he solucionado mi respuesta para que coincida con solo más de 5 repeticiones. –

+0

Perfecto, gracias! –

+0

+1 para arreglarlo. – eldarerathis

11

Corrección, debería ser (.)\1{5,}, creo. Mi error. Esto se obtiene:

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

También puede restringir a las cartas usando (\w)\1{5,} o ([a-zA-Z])\1{5,}

+0

Esto también coincidirá con * "hello" *, * "goodbye" *, o cualquier otra cadena de más de cuatro caracteres. – LukeH

+0

@LukeH: Definitivamente espaciado en eso. Gracias. – eldarerathis

+0

Esto funcionará, pero tenga en cuenta que "." coincide con todos los personajes excepto Linebreaks. Esto incluye espacios en blanco, números, etc. – Powertieke

0

Puede utilizar la expresión regular:

(.)\1{5,} 

Explicación:

  • .: char Meta que coincide con cualquier carbón.
  • (): Se utilizan para agrupar y recordando el único carácter coincidente.
  • \1: referencia de referencia al único char que se recordaba en el paso anterior .
  • {5,}: cuantificador de 5 o más

y en PHP que se puede utilizar como:

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

Salida:

Found repeating char o in helloooooooooo 
1

Sip.

(.)\1+ 

Esto coincidirá con las secuencias repetidas de cualquier carácter.

El \1 observa el contenido del primer conjunto de corchetes. (por lo tanto, si tiene una expresión regular más compleja, deberá ajustarla al número correcto para que recoja el conjunto correcto de corchetes).

Si es necesario especificar, dicen que más de tres de ellos:

(.)\1{3,} 

La sintaxis \ 1 es bastante potente - por ejemplo También puede usarlo en otra parte de su expresión regular para buscar el mismo carácter que aparece en diferentes lugares en su cadena de búsqueda.

Cuestiones relacionadas