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

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

m|\w{2,3}| 

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

m|a{2,3}| 

Не сработает, так как он не будет соответствовать bbb, ccc и т. д. .

43
задан DontVoteMeDown 23 December 2014 в 16:07
поделиться

6 ответов

Решенный вопрос! Группировка и ссылки является Вашими друзьями:

(.)\1+

будет соответствовать 2 или больше происшествиям того же символа. Для символов составляющей слова только, используйте \w вместо ., т.е.:

(\w)\1+
85
ответ дан David Hanak 26 November 2019 в 22:42
поделиться

Это будет соответствовать больше чем , \w был бы, как @@@:

/(.)\1+/
4
ответ дан gpojd 26 November 2019 в 22:42
поделиться

Обратите внимание, что в 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>+/;
}
10
ответ дан oylenshpeegul 26 November 2019 в 22:42
поделиться

Это - то, для чего обратные ссылки.

m/(\w)\1\1/

добьется цели.

1
ответ дан friedo 26 November 2019 в 22:42
поделиться

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

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

, Где... z являются символами в конечном алфавите.

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

1
ответ дан Edmund 26 November 2019 в 22:42
поделиться

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

m|(\w)\1+|
0
ответ дан DontVoteMeDown 26 November 2019 в 22:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: