什么正则expression式可以匹配相同字符的序列?

一个朋友问我这个,我很难过:有没有一种方法来制作一个正则expression式,匹配一个相同的字符序列? 例如,匹配'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/ 

会做的伎俩。

这也可以使用纯正则expression式(即描述正则语言的那些 – 而不是 Perl正则expression式)。 不幸的是,这意味着正则expression式的长度与字母表的大小成正比,例如:

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

其中… z是有限字母表中的符号。

所以,Perl正则expression式虽然是纯正则expression式的超集,但即使您只是想将它们用于纯正则expression式,也是有其优势的!

回答我自己的问题,但明白了:

 m|(\w)\1+|