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

时间:2009-03-13 21:39:14

标签: regex perl

一位朋友问我这件事,我感到难过:有没有办法制作一个匹配同一个角色序列的正则表达式?例如,匹配'aaa','bbb',但不是'abc'?

m|\w{2,3}| 

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

m|a{2,3}| 

不会这样做,因为它不会匹配'bbb','ccc'等。

7 个答案:

答案 0 :(得分:76)

当然可以!分组和参考是你的朋友:

(.)\1+

将匹配2个或更多同一个字符的出现。仅对于单词构成字符,请使用\w代替.,即:

(\w)\1+

答案 1 :(得分: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>+/;
}

答案 2 :(得分:4)

这将超过 \ w ,例如@@@:

/(.)\1+/

答案 3 :(得分:1)

这是后面的参考。

m/(\w)\1\1/

会做到这一点。

答案 4 :(得分:1)

这也可以使用纯正则表达式(即那些描述常规语言的表达式 - not Perl regexps)。不幸的是,它意味着一个正则表达式,其长度与字母表的大小成正比,例如:

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

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

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

答案 5 :(得分:0)

回答我自己的问题,但得到了它:

m|(\w)\1+|

答案 6 :(得分:0)

如果您正在使用Java,并且在给定字符串中找到重复的字符,则代码为

public class Test {
public static void main(String args[]) {
    String s = "abbc";
    if (s.matches(".*([a-zA-Z])\\1+.*")) {
        System.out.println("Duplicate found!");
    } else {
        System.out.println("Duplicate not found!");
    }
}

}