什么正则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+|