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