Регулярне вираження для відповідності будь-якому символу, що повторюється більше 10 разів


107

Я шукаю простий регулярний вираз, щоб відповідати тому ж символу, який повторюється більше 10 разів. Наприклад, якщо у мене документ, горизонтальний рядок:

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

Він буде відповідати лінії =символів, оскільки повторюється більше 10 разів. Зауважте, що я хотів би, щоб це працювало для будь-якого персонажа.


2
заголовок цього асинвер вводить в оману, ви повинні сказати "Регулярний вираз, щоб відповідати будь-якому символу, повтореному більше 10 разів"
dalloliogm

Відповіді:


157

Вам потрібен регулярний вираз /(.)\1{9,}/.

Тест:

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

Тут \1називається зворотною референцією. Він посилається на те, що захоплюється крапкою .між дужками, (.)а потім {9,}запитує дев'ять і більше того ж символу. Таким чином, це відповідає десяти і більше будь-яких окремих символів.

Хоча вищевказаний тестовий скрипт є в Perl, це дуже стандартний синтаксис регулярних виразів і повинен працювати будь-якою мовою. У деяких варіантах вам може знадобитися використовувати більше зворотних нахилів, наприклад, Emacs змусить вас писати \(.\)\1\{9,\}тут.

Якщо цілий рядок повинен складатися з 9 і більше однакових символів, додайте якорі навколо шаблону:

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

28

У Python ви можете використовувати (.)\1{9,}

  • (.) робить групу з одного знака (будь-якого символу)
  • \ 1 {9,} відповідає дев'яти і більше символів з 1-ї групи

приклад:

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

Вихід:

1. aaaaaaaaaaaaaaa
3. cccccccccccccccccccc
5. eeeeeeeeeeee

if re.search (рядок): рядок друку (присвоєння змінної rxx не потрібно)
dalloliogm

1
Ви маєте рацію в цьому простому контексті. За допомогою змінної rxx я можу зробити щось на кшталт rxx.group (1), rxx.start (1) тощо
Michał Niklas

5

.відповідає будь-якому символу. Використовується разом із уже згаданими фігурними брекетами:

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


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

Привіт, Джек і @SilentGhost. Дві команди grep -E '([=o])\1{10}' testі grep -E '([=o]){10}' testчудово працює з вашим прикладом (відзначте відсутність \1у другій команді). Але команда grep -E '([=o])\1{10}' <<< '==o==o==o==o==o==o===o==o==='не відповідає рядку! Однак команда без \1сірників рядки: grep -E '([=o]){10}' <<< '==o==o==o==o==o==o===o==o==='. Будь ласка, можете пояснити? Ура;)
олібре

3

У деяких додатках потрібно видалити косої риски, щоб вона працювала.

/(.)\1{9,}/

або це:

(.)\1{9,}

1

скористайтеся оператором {10,}:

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

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

1

Ви також можете використовувати PowerShell для швидкої заміни слів або повторів символів. PowerShell призначений для Windows. Поточна версія - 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_replaceПриклад PHP :

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

Тут [a-z]потрапляє персонаж, ()а потім дозволяє використовувати його з \\1зворотною референцією, яка намагається відповідати іншому тому ж символу (зауважте, це націлена вже на два послідовних символи), таким чином:

мати батько

Якщо ви зробили:

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

це буде стиранням 3 послідовних повторних символів, виведення:

moherbb її


0
={10,}

сірники, =які повторюються 10 і більше разів.


1
впевнені, що це не потребує 10 і більше довільних символів?
Ітан

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

це було неправильно, але воно було відредаговане (щоб відповідати моїй відповіді, яка отримала кілька відгуків, добре)
dalloliogm

2
Джи, не знав, що я повинен сказати прямо, що ти можеш замінити персонажа на все, що завгодно.
SilentGhost

0

Трохи більш загальний приклад оболонки. У папері 7 можна виділити відповідність, включаючи останній пробіл (ви можете виділити в стеці?).

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

a b c d e f 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.