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,}
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