Ekspresi reguler untuk mencocokkan karakter apa pun yang diulang lebih dari 10 kali

107

Saya mencari persamaan reguler sederhana untuk mencocokkan karakter yang sama yang diulang lebih dari 10 kali atau lebih. Jadi misalnya, jika saya memiliki dokumen yang dikotori dengan garis horizontal:

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

Ini akan cocok dengan baris =karakter karena diulang lebih dari 10 kali. Perhatikan bahwa saya ingin ini berfungsi untuk karakter apa pun .

Justin
sumber
2
judul jawaban ini menyesatkan, Anda seharusnya mengatakan 'Persamaan reguler untuk mencocokkan karakter apa pun yang diulang lebih dari 10 kali'
dalloliogm

Jawaban:

157

Regex yang Anda butuhkan adalah /(.)\1{9,}/.

Uji:

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

Di sini yang \1disebut referensi latar. Ini merujuk pada apa yang ditangkap oleh titik di .antara tanda kurung (.)dan kemudian {9,}meminta sembilan atau lebih karakter yang sama. Jadi ini cocok dengan sepuluh atau lebih karakter tunggal apa pun.

Meskipun skrip pengujian di atas ada di Perl, ini adalah sintaks regex yang sangat standar dan harus berfungsi dalam bahasa apa pun. Pada beberapa varian Anda mungkin perlu menggunakan lebih banyak garis miring terbalik, misalnya Emacs akan membuat Anda menulis di \(.\)\1\{9,\}sini.

Jika seluruh string harus terdiri dari 9 atau lebih karakter identik, tambahkan jangkar di sekitar pola:

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

Dengan Python, Anda bisa menggunakan (.)\1{9,}

  • (.) membuat grup dari satu karakter (karakter apa saja)
  • \ 1 {9,} cocok dengan sembilan atau lebih karakter dari grup pertama

contoh:

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

Keluaran:

1. aaaaaaaaaaaaaaa
3. cccccccccccccccccccc
5. eeeeeeeeeeee
Michał Niklas
sumber
jika re.search (baris): print line (penugasan ke variabel rxx tidak diperlukan)
dalloliogm
1
Anda benar dalam konteks sederhana ini. Menggunakan variabel rxx saya dapat melakukan sesuatu seperti rxx.group (1), rxx.start (1) dll.
Michał Niklas
5

.cocok dengan karakter apapun. Digunakan bersama dengan kurung kurawal yang telah disebutkan:

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


$: grep -E '(.)\1{10}' test
============================
ooooooooooooooooooooooo
jeekl
sumber
Hai Jeek dan @SilentGhost. Dua perintah grep -E '([=o])\1{10}' testdan grep -E '([=o]){10}' testberfungsi dengan baik dengan contoh Anda (perhatikan kekurangan \1di perintah kedua). Tapi perintahnya grep -E '([=o])\1{10}' <<< '==o==o==o==o==o==o===o==o==='tidak cocok dengan barisnya! Namun perintah tanpa \1pertandingan baris: grep -E '([=o]){10}' <<< '==o==o==o==o==o==o===o==o==='. Bisakah Anda menjelaskan? Cheers;)
olibre
3

Pada beberapa aplikasi, Anda perlu menghapus garis miring agar berfungsi.

/(.)\1{9,}/

atau ini:

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

gunakan operator {10,}:

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

$: grep -E '={10,}' testre
============================
==============
dalloliogm.dll
sumber
1

Anda juga dapat menggunakan PowerShell untuk mengganti kata atau reptil karakter dengan cepat . PowerShell untuk Windows. Versi saat ini adalah 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
JAHAT
sumber
1

preg_replaceContoh PHP :

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

Di sini [a-z]mengenai karakter, ()kemudian memungkinkan untuk digunakan dengan \\1referensi latar yang mencoba mencocokkan karakter lain yang sama (perhatikan ini sudah menargetkan 2 karakter berturut-turut), jadi:

Ayah ibu

Jika Anda melakukannya:

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

yang akan menghapus 3 karakter berulang berturut-turut, menghasilkan:

moherbb dia

LihO
sumber
0
={10,}

pertandingan =yang diulangi 10 kali atau lebih.

SilentGhost
sumber
1
yakin bahwa ini tidak mengambil 10 atau lebih karakter sewenang-wenang?
Etan
perl -e 'print "NO" if "abcdefghijklmno" =~ /.{10,}/;'
itu salah, tetapi telah diedit (untuk mencocokkan jawaban saya yang mendapat beberapa
suara negatif
2
Gee, tidak tahu saya harus mengatakan secara eksplisit bahwa Anda dapat mengganti karakter dengan apa pun yang Anda inginkan.
SilentGhost
0

Contoh PowerShell yang sedikit lebih umum. Di PowerShell 7, pertandingan disorot termasuk spasi terakhir (dapatkah Anda sorot di tumpukan?).

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

a b c d e f 
js2010
sumber