Подтвердить что ты не робот

Как я могу найти повторяющиеся буквы с регулярным выражением Perl?

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

booooooot or abbott

Я не буду знать письмо, которое я ищу раньше времени.

Это вопрос, который меня задали в интервью, а затем спросил в интервью. Не так много людей понимают это правильно.

4b9b3361

Ответ 1

Вы можете найти любую букву, затем используйте \1, чтобы найти эту же букву во второй раз (или больше). Если вам нужно знать только письмо, тогда $1 будет содержать его. В противном случае вы можете соединить второе совпадение с первым.

my $str = "Foooooobar";

$str =~ /(\w)(\1+)/;

print $1;
# prints 'o'
print $1 . $2;
# prints 'oooooo'

Ответ 2

Я думаю, что вы действительно хотите это, а не "\ w", поскольку это включает числа и подчеркивание.

([a-zA-Z])\1+

Хорошо, хорошо, я могу взять намек Леона. Используйте это для unicode-world или для вещей в стиле.

([[:alpha:]])\1+

Ответ 3

Думаю, что использование backreference будет работать:

(\w)\1+

\w в основном [a-zA-Z_0-9], поэтому, если вы хотите только сопоставить буквы между A и Z (регистр нечувствителен), используйте [a-zA-Z] вместо этого.

(EDIT: или, как упоминал Танктул в своем комментарии (и, как и другие ответили), [[:alpha:]], который чувствителен к локали)

Ответ 4

Используйте\N для обращения к предыдущим группам:

/(\w)\1+/g

Ответ 5

Возможно, вы захотите позаботиться о том, что считается письмом, и это зависит от вашего языка. Использование ISO Latin-1 позволит акцентированным символам западного языка соответствовать буквам. В следующей программе локаль по умолчанию не распознает é, и, следовательно, créé не соответствует. Раскомментируйте код установки локали, а затем он начнет соответствовать.

Также обратите внимание, что \w содержит цифры и символ подчеркивания вместе со всеми буквами. Чтобы получить только буквы, вам нужно взять дополнение не алфавита, цифр и символов подчеркивания. Это оставляет только буквы.

Это может быть проще понять, обратив его в качестве вопроса "Какое регулярное выражение соответствует любой цифре, кроме 3?", и ответ:/[^\D3]/.

#! /usr/local/bin/perl

use strict;
use warnings;

# uncomment the following three lines:
# use locale;
# use POSIX;
# setlocale(LC_CTYPE, 'fr_FR.ISO8859-1');

while (<DATA>) {
    chomp;
    if (/([^\W_0-9])\1+/) {
        print "$_: dup [$1]\n";
    }
    else {
        print "$_: nope\n";
    }
}

__DATA__
100
food
créé
a::b

Ответ 6

Следующий код вернет все символы, которые повторяются дважды или более.

my $str = "SSSannnkaaarsss";

print $str = ~/(\ w)\1 +/g;

Ответ 7

Просто для пинков, совершенно другой подход:

if ( ($str ^ substr($str,1) ) =~ /\0+/ ) {
    print "found ", substr($str, $-[0], $+[0]-$-[0]+1), " at offset ", $-[0];
}

Ответ 8

FYI, помимо RegExBuddy, настоящий удобный сайт для тестирования регулярных выражений RegExr на gskinner.com. Хорошо обрабатывает ([[:alpha:]])(\1+).

Ответ 9

Как насчет:

(\w)\1+

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

Ответ 10

Я думаю, что это также должно работать:

((\w)(?=\2))+\2

Ответ 11

/(.)\\1{2,}+/u

'u' модификатор, соответствующий с unicode