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

Какое регулярное выражение может соответствовать последовательностям одного и того же символа?

Друг спросил меня об этом, и я был в тупике: есть ли способ создать регулярное выражение, которое соответствует последовательности одного и того же символа? Например, совпадение на 'aaa', 'bbb', но не 'abc'?

m|\w{2,3}| 

Не будет трюк, поскольку он будет соответствовать "abc".

m|a{2,3}| 

Не сделал бы трюк, поскольку он не соответствовал бы "bbb", "ccc" и т.д.

4b9b3361

Ответ 1

Конечно! Группировка и ссылки - ваши друзья:

(.)\1+

Будет соответствовать 2 или более случаев одного и того же символа. Только для текстовых составляющих символов используйте \w вместо ., то есть:

(\w)\1+

Ответ 2

Обратите внимание, что в Perl 5.10 мы также имеем альтернативные обозначения для обратных ссылок.

foreach (qw(aaa bbb abc)) {
  say;
  say ' original' if /(\w)\1+/;
  say ' new way'  if /(\w)\g{1}+/;
  say ' relative' if /(\w)\g{-1}+/;
  say ' named'    if /(?'char'\w)\g{char}+/;
  say ' named'    if /(?<char>\w)\k<char>+/;
}

Ответ 3

Это будет соответствовать более \w, например, @@@:

/(.)\1+/

Ответ 4

Вот для чего нужны обратные ссылки.

m/(\w)\1\1/

сделает трюк.

Ответ 5

Это также возможно использование чистых регулярных выражений (т.е. те, которые описывают обычные языки, а не регулярные выражения Perl). К сожалению, это означает регулярное выражение, длина которого пропорциональна размеру алфавита, например:

(a* + b* + ... + z*)

Где a... z - символы в конечном алфавите.

Таким образом, регулярные выражения Perl, хотя и представляют собой надмножество чистых регулярных выражений, безусловно, имеют свои преимущества, даже если вы просто хотите использовать их для чистых регулярных выражений!

Ответ 6

Отвечая на мой собственный вопрос, но получил его:

m|(\w)\1+|