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 .


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,}$/;

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

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

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

1

gunakan operator {10,}:

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

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

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

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


0
={10,}

pertandingan =yang diulangi 10 kali atau lebih.


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 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.