Ответ 1
Конечно! Группировка и ссылки - ваши друзья:
(.)\1+
Будет соответствовать 2 или более случаев одного и того же символа. Только для текстовых составляющих символов используйте \w
вместо .
, то есть:
(\w)\1+
Друг спросил меня об этом, и я был в тупике: есть ли способ создать регулярное выражение, которое соответствует последовательности одного и того же символа? Например, совпадение на 'aaa', 'bbb', но не 'abc'?
m|\w{2,3}|
Не будет трюк, поскольку он будет соответствовать "abc".
m|a{2,3}|
Не сделал бы трюк, поскольку он не соответствовал бы "bbb", "ccc" и т.д.
Конечно! Группировка и ссылки - ваши друзья:
(.)\1+
Будет соответствовать 2 или более случаев одного и того же символа. Только для текстовых составляющих символов используйте \w
вместо .
, то есть:
(\w)\1+
Обратите внимание, что в 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>+/;
}
Это будет соответствовать более \w, например, @@@:
/(.)\1+/
Вот для чего нужны обратные ссылки.
m/(\w)\1\1/
сделает трюк.
Это также возможно использование чистых регулярных выражений (т.е. те, которые описывают обычные языки, а не регулярные выражения Perl). К сожалению, это означает регулярное выражение, длина которого пропорциональна размеру алфавита, например:
(a* + b* + ... + z*)
Где a... z - символы в конечном алфавите.
Таким образом, регулярные выражения Perl, хотя и представляют собой надмножество чистых регулярных выражений, безусловно, имеют свои преимущества, даже если вы просто хотите использовать их для чистых регулярных выражений!
Отвечая на мой собственный вопрос, но получил его:
m|(\w)\1+|