Expression régulière correspondant à n’importe quel caractère répété plus de 10 fois

Je cherche une expression régulière simple pour correspondre au même caractère répété plus d’une dizaine de fois. Donc, par exemple, si j’ai un document jonché de lignes horizontales:

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

Il correspondra à la ligne de caractères = car il est répété plus de 10 fois. Notez que je voudrais que cela fonctionne pour n’importe quel personnage.

La regex dont vous avez besoin est /(.)\1{9,}/ .

Tester:

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

Ici, le \1 est appelé un backreference. Il référence ce qui est capturé par le point . entre les parenthèses (.) puis le {9,} demande neuf ou plus du même caractère. Ainsi, cela correspond à dix caractères ou plus.

Bien que le script de test ci-dessus soit en Perl, il s’agit d’une syntaxe regex très standard qui devrait fonctionner dans n’importe quel langage. Dans certaines variantes, vous devrez peut-être utiliser plus de barres obliques inverses, par exemple Emacs vous obligerait à écrire \(.\)\1\{9,\} ici.

Si une chaîne entière doit comporter 9 caractères identiques ou plus, ajoutez des ancres autour du motif:

 my $regex = qr/^(.)\1{9,}$/; 

En Python, vous pouvez utiliser (.)\1{9,}

  • (.) crée un groupe à partir d’un seul caractère (n’importe quel caractère)
  • \ 1 {9,} correspond à neuf caractères ou plus du 1er groupe

Exemple:

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

Sortie:

 1. aaaaaaaaaaaaaaa 3. cccccccccccccccccccc 5. eeeeeeeeeeee 

. correspond à n’importe quel caractère. Utilisé conjointement avec les accolades déjà mentionnées:

 $: cat > test ======== ============================ oo ooooooooooooooooooooooo $: grep -E '(.)\1{10}' test ============================ ooooooooooooooooooooooo 

utilisez l’opérateur {10,}:

 $: cat > testre ============================ == ============== $: grep -E '={10,}' testre ============================ ============== 

Vous pouvez également utiliser PowerShell pour remplacer rapidement les mots ou les répétitions de caractères. PowerShell est pour Windows. La version actuelle est la 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 

Sur certaines applications, vous devez supprimer les barres obliques pour que cela fonctionne.

 /(.)\1{9,}/ 

ou ca:

 (.)\1{9,} 

Exemple avec preg_replace de PHP:

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

Ici [az] frappe le caractère, () lui permet alors d’être utilisé avec \\1 backreference qui essaie de correspondre à un autre même caractère (notez que cela cible déjà 2 caractères consécutifs), donc:

mère père

Si vous avez fait:

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

ce serait effacer 3 caractères répétés consécutifs, produisant:

la moherbb

 ={10,} 

correspond à = répète 10 fois ou plus.

On dirait que la regex dont vous avez besoin est: 8 = * D

 grep -E "8=*D" sampletext