Expresión regular para que coincida con cualquier carácter que se repita más de 10 veces

107

Estoy buscando una expresión regular simple para que el mismo carácter se repita más de 10 veces. Entonces, por ejemplo, si tengo un documento lleno de líneas horizontales:

=================================================

Coincidirá con la línea de = caracteres porque se repite más de 10 veces. Tenga en cuenta que me gustaría que esto funcione para cualquier personaje.

Justin
fuente
2
el título de esta respuesta es engañoso, debería haber dicho 'Expresión regular para coincidir con cualquier carácter repetido más de 10 veces'
dalloliogm

Respuestas:

157

La expresión regular que necesita es /(.)\1{9,}/.

Prueba:

#!perl
use warnings;
use strict;
my $regex = qr/(.)\1{9,}/;
print "NO" if "abcdefghijklmno" =~ $regex;
print "YES" if "------------------------" =~ $regex;
print "YES" if "========================" =~ $regex;

Aquí \1se llama referencia inversa. Hace referencia a lo que está capturado por el punto .entre los corchetes (.)y luego {9,}pide nueve o más del mismo carácter. Por lo tanto, esto coincide con diez o más de cualquier carácter.

Aunque el script de prueba anterior está en Perl, esta es una sintaxis de expresiones regulares muy estándar y debería funcionar en cualquier idioma. En algunas variantes, es posible que necesite utilizar más barras invertidas, por ejemplo, Emacs le haría escribir \(.\)\1\{9,\}aquí.

Si una cadena completa debe constar de 9 o más caracteres idénticos, agregue anclas alrededor del patrón:

my $regex = qr/^(.)\1{9,}$/;
Wiktor Stribiżew
fuente
28

En Python puedes usar (.)\1{9,}

  • (.) hace grupo a partir de un carácter (cualquier carácter)
  • \ 1 {9,} coincide con nueve o más caracteres del primer grupo

ejemplo:

txt = """1. aaaaaaaaaaaaaaa
2. bb
3. cccccccccccccccccccc
4. dd
5. eeeeeeeeeeee"""
rx = re.compile(r'(.)\1{9,}')
lines = txt.split('\n')
for line in lines:
    rxx = rx.search(line)
    if rxx:
        print line

Salida:

1. aaaaaaaaaaaaaaa
3. cccccccccccccccccccc
5. eeeeeeeeeeee
Michał Niklas
fuente
if re.search (línea): línea de impresión (la asignación a la variable rxx no es necesaria)
dalloliogm
1
Tienes razón en este simple contexto. Usando la variable rxx puedo hacer algo como rxx.group (1), rxx.start (1), etc.
Michał Niklas
5

.coincide con cualquier personaje. Usado junto con las llaves ya mencionadas:

$: cat > test
========
============================
oo
ooooooooooooooooooooooo


$: grep -E '(.)\1{10}' test
============================
ooooooooooooooooooooooo
jeekl
fuente
Hola Jeek y @SilentGhost. Los dos comandos grep -E '([=o])\1{10}' testy grep -E '([=o]){10}' testfuncionan bien con su ejemplo (tenga en cuenta la falta de \1en el segundo comando). ¡Pero el comando grep -E '([=o])\1{10}' <<< '==o==o==o==o==o==o===o==o==='no coincide con la línea! Sin embargo, el comando sin \1partidos la línea: grep -E '([=o]){10}' <<< '==o==o==o==o==o==o===o==o==='. ¿Podría explicarme? Saludos;)
olibre
3

En algunas aplicaciones, debes eliminar las barras para que funcione.

/(.)\1{9,}/

o esto:

(.)\1{9,}
Patoshi パ ト シ
fuente
1

use el operador {10,}:

$: cat > testre
============================
==
==============

$: grep -E '={10,}' testre
============================
==============
dalloliogm
fuente
1

También puede usar PowerShell para reemplazar rápidamente palabras o repticiones de caracteres. PowerShell es para Windows. La versión actual es 3.0.

$oldfile = "$env:windir\WindowsUpdate.log"

$newfile = "$env:temp\newfile.txt"
$text = (Get-Content -Path $oldfile -ReadCount 0) -join "`n"

$text -replace '/(.)\1{9,}/', ' ' | Set-Content -Path $newfile
MAL
fuente
1

preg_replaceEjemplo de PHP :

$str = "motttherbb fffaaattther";
$str = preg_replace("/([a-z])\\1/", "", $str);
echo $str;

Aquí [a-z]golpea el carácter, ()luego permite que se use con \\1referencia inversa que intenta hacer coincidir otro mismo carácter (tenga en cuenta que esto ya está apuntando a 2 caracteres consecutivos), así:

madre padre

Si lo hiciste:

$str = preg_replace("/([a-z])\\1{2}/", "", $str);

eso sería borrar 3 caracteres repetidos consecutivos, dando como resultado:

moherbb ella

LihO
fuente
0
={10,}

coincidencias =que se repiten 10 o más veces.

SilentGhost
fuente
1
¿Seguro que para esto no se necesitan 10 o más caracteres arbitrarios?
Etan
perl -e 'print "NO" if "abcdefghijklmno" =~ /.{10,}/;'
estaba mal, pero se ha editado (para que coincida con mi respuesta que obtuvo algunos
votos negativos
2
Vaya, no sabía que tenía que decir explícitamente que puedes reemplazar el personaje con lo que quieras.
SilentGhost
0

Un ejemplo de PowerShell un poco más genérico. En powershell 7, la coincidencia se resalta incluido el último espacio (¿puedes resaltar en la pila?).

'a b c d e f ' | select-string '([a-f] ){6,}'

a b c d e f 
js2010
fuente