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