正则表达式可以匹配相同字符的序列?

Bil*_*ill 43 regex perl

一位朋友问我这个问题,我很难过:有没有办法制作一个匹配同一个字符序列的正则表达式?例如,匹配'aaa','bbb',但不是'abc'?

m|\w{2,3}| 
Run Code Online (Sandbox Code Playgroud)

不会这样做,因为它匹配'abc'.

m|a{2,3}| 
Run Code Online (Sandbox Code Playgroud)

不会做的伎俩,因为它不匹配'bbb','ccc'等.

Dav*_*nak 85

当然可以!分组和引用是你的朋友:

(.)\1+
Run Code Online (Sandbox Code Playgroud)

将匹配2个或更多相同字符的出现.仅对于单词构成字符,请使用\w而不是.,即:

(\w)\1+
Run Code Online (Sandbox Code Playgroud)

  • \1 是对第一组的引用。(.) 是第一组。 (2认同)

oyl*_*gul 10

请注意,在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>+/;
}
Run Code Online (Sandbox Code Playgroud)