Как я могу найти повторяющиеся буквы с регулярным выражением Perl?
Я ищу регулярное выражение, которое найдет повторяющиеся письма. Так что любая буква дважды или больше, например:
booooooot or abbott
Я не буду знать письмо, которое я ищу раньше времени.
Это вопрос, который меня задали в интервью, а затем спросил в интервью. Не так много людей понимают это правильно.
Ответы
Ответ 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