Регулярное выражение для соответствия любому символу, повторяемому более 10 раз - PullRequest
85 голосов
/ 02 ноября 2009

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

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

Будет соответствовать строке из = символов, поскольку повторяется более 10 раз. Обратите внимание , что я хотел бы, чтобы это работало для любого символа.

Ответы [ 8 ]

135 голосов
/ 02 ноября 2009

Необходимое регулярное выражение: /(.)\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,}$/;
22 голосов
/ 02 ноября 2009

В Python вы можете использовать (.)\1{9,}

  • (.) Делает группу из одного символа (любого символа)
  • \ 1 {9,} соответствует девяти или более символам из первой группы

пример:

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
3 голосов
/ 02 ноября 2009

. соответствует любому символу. Используется в сочетании с уже упомянутыми фигурными скобками:

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


$: grep -E '(.)\1{10}' test
============================
ooooooooooooooooooooooo
1 голос
/ 24 марта 2016

В некоторых приложениях вам нужно удалить косую черту, чтобы она работала.

/(.)\1{9,}/

или это:

(.)\1{9,}
1 голос
/ 13 июня 2013

Вы также можете использовать 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 голос
/ 02 ноября 2009

используйте оператор {10,}:

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

$: grep -E '={10,}' testre
============================
==============
0 голосов
/ 07 июня 2018

Пример PHP preg_replace:

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

Здесь [a-z] попадает на символ, () затем позволяет использовать его с \\1 обратной ссылкой, которая пытается сопоставить другой символ (обратите внимание, что он уже нацелен на 2 последовательных символа), таким образом:

мама папа

Если вы сделали:

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

, который будет стирать 3 последовательных повторяющихся символа, выводя:

Мохербб ее

0 голосов
/ 02 ноября 2009
={10,}

соответствует =, что повторяется 10 или более раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...