10 defadan fazla tekrarlanan herhangi bir karakterle eşleşen normal ifade


107

10 veya daha fazla kez tekrarlanan aynı karakterle eşleşen basit bir normal ifade arıyorum. Örneğin, yatay çizgilerle dolu bir belgem varsa:

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

=10 defadan fazla tekrarlandığı için karakter satırıyla eşleşecektir . Bunun herhangi bir karakter için çalışmasını istediğimi unutmayın .


2
bu tablonun başlığı yanıltıcıdır, '10 defadan fazla tekrarlanan herhangi bir karakterle eşleşecek normal ifade'
demelisiniz

Yanıtlar:


157

İhtiyacınız olan normal ifade /(.)\1{9,}/.

Ölçek:

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

Burada geri \1referans denir. .Köşeli parantezler arasındaki noktanın yakaladığı şeyi referans alır (.)ve ardından {9,}aynı karakterden dokuz veya daha fazlasını ister. Böylece bu, herhangi bir tek karakterden on veya daha fazlasıyla eşleşir.

Yukarıdaki test komut dosyası Perl'de olmasına rağmen, bu çok standart düzenli ifade sözdizimidir ve herhangi bir dilde çalışmalıdır. Bazı varyantlarda daha fazla ters eğik çizgi kullanmanız gerekebilir, örneğin Emacs \(.\)\1\{9,\}buraya yazmanızı sağlar .

Bir dizenin tamamı 9 veya daha fazla aynı karakterden oluşuyorsa, desenin etrafına çapalar ekleyin:

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

28

Python'da kullanabilirsiniz (.)\1{9,}

  • (.) bir karakterden (herhangi bir karakterden) grup oluşturur
  • \ 1 {9,} 1. gruptan dokuz veya daha fazla karakterle eşleşir

misal:

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

Çıktı:

1. aaaaaaaaaaaaaaa
3. cccccccccccccccccccc
5. eeeeeeeeeeee

re.search (line) ise: satır yazdır (rxx değişkenine atama gerekli değildir)
dalloliogm

1
Bu basit bağlamda haklısınız. Rxx değişkenini kullanarak rxx.group (1), rxx.start (1) vb. Gibi şeyler yapabilirim.
Michał Niklas

5

.herhangi bir karakterle eşleşir. Daha önce bahsedilen küme parantezleriyle birlikte kullanılır:

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


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

Merhaba Jeek ve @SilentGhost. İki komut grep -E '([=o])\1{10}' testve grep -E '([=o]){10}' testörneğinizle gayet iyi çalışıyor ( \1ikinci komuttaki eksikliğine dikkat edin ). Ancak komut grep -E '([=o])\1{10}' <<< '==o==o==o==o==o==o===o==o==='satırla uyuşmuyor! Ancak olmadan komut \1maçları satırı: grep -E '([=o]){10}' <<< '==o==o==o==o==o==o===o==o==='. Lütfen açıklar mısın? Şerefe;)
olibre

3

Bazı uygulamalarda, çalışması için eğik çizgileri kaldırmanız gerekir.

/(.)\1{9,}/

veya bu:

(.)\1{9,}

1

{10,} operatörünü kullanın:

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

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

1

Kelimeleri veya karakter tekrarlarını hızla değiştirmek için PowerShell'i de kullanabilirsiniz . PowerShell, Windows içindir. Mevcut sürüm 3.0'dır.

$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

PHP preg_replaceörneği:

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

Burada [a-z]karaktere çarpar, ()ardından \\1aynı karakterle eşleşmeye çalışan geri referansla kullanılmasına izin verir (bunun zaten art arda 2 karakteri hedeflediğini unutmayın), böylece:

anne baba

Yaptıysanız:

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

bu, art arda tekrarlanan 3 karakteri silip çıktı:

Moherbb onu


0
={10,}

=10 veya daha fazla kez tekrarlanan maçlar .


1
bunun 10 veya daha fazla rastgele karakter almadığından emin misiniz?
Etan

perl -e 'print "NO" if "abcdefghijklmno" =~ /.{10,}/;'

yanlıştı, ama düzenlendi (cevabımla eşleşmek için bazı olumsuz oylar aldı, iyi)
dalloliogm

2
Tanrım, karakteri istediğiniz herhangi bir şeyle değiştirebileceğinizi açıkça söylemem gerektiğini bilmiyordum.
SilentGhost

0

Biraz daha genel bir powershell örneği. Powershell 7'de maç, son boşluk dahil vurgulanır (yığında vurgulayabilir misiniz?).

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

a b c d e f 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.