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

Regex 什么正则表达式可以匹配相同字符的序列?,regex,perl,Regex,Perl,一位朋友问我这个问题,我被难住了:有没有一种方法可以设计一个正则表达式来匹配相同字符的序列?例如,匹配“aaa”、“bbb”,但不匹配“abc” m|\w{2,3}| 不会玩这个把戏,因为它会匹配“abc” m|a{2,3}| 不会玩这个把戏,因为它不会匹配“bbb”、“ccc”等。回答我自己的问题,但得到了: m|(\w)\1+| 当然可以!分组和引用是您的朋友: (.)\1+ 将匹配相同字符的两个或多个出现。仅对于单词组成字符,请使用\w而不是,即: (\w)\1+ 这就是反向

一位朋友问我这个问题,我被难住了:有没有一种方法可以设计一个正则表达式来匹配相同字符的序列?例如,匹配“aaa”、“bbb”,但不匹配“abc”

m|\w{2,3}| 
不会玩这个把戏,因为它会匹配“abc”

m|a{2,3}| 

不会玩这个把戏,因为它不会匹配“bbb”、“ccc”等。

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

m|(\w)\1+|

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

(.)\1+
将匹配相同字符的两个或多个出现。仅对于单词组成字符,请使用
\w
而不是
,即:

(\w)\1+

这就是反向引用的用途

m/(\w)\1\1/

将完成此操作。

这将匹配比\w更匹配的内容,如@@@

/(.)\1+/

请注意,在Perl5.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>+/;
}
foreach(qw(aaa bbb abc)){
说,;
如果/(\w)\1+/,则说“原件”;
如果/(\w)\g{1}+/,则说“新方式”;
如果/(\w)\g{-1}+/,则说“相对的”;
如果/(?'char'\w)\g{char}+/,则说'named';
如果/(?\w)\k+/,则说“已命名”;
}

这也可以使用纯正则表达式(即描述正则语言的表达式,而不是Perl正则表达式)。不幸的是,它表示长度与字母表大小成比例的regexp,例如:

(a* + b* + ... + z*)
其中a…z是有限字母表中的符号


因此,尽管Perl正则表达式是纯正则表达式的超集,但即使您只想将其用于纯正则表达式,Perl正则表达式也肯定有其优势

如果您使用的是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!");
    }
}

}

\W与您想要的正好相反,不是吗?Telemachus是对的,这与您在问题中给出的示例不匹配。此外,除非您有理由,否则最好不要对正则表达式使用管道(或任何其他非默认分隔符)。或者这是正确的一个,用于“相同字符的序列”,而不仅仅是“aaa”、“bbb”示例+1将表达式嵌入斜杠“/”与不使用斜杠“/”之间有什么区别?这将只匹配一些字符,而忽略像“###”这样的字符。他给出的例子是字母字符,但实际上并不是只要求字母字符。我将“\w”替换为“.”。根据提问者给出的非操作性示例,我假设他/她只想匹配字母字符。我应该在解释中表达这一点。斜杠1是什么意思?\1是指第一组。(.)是第一组,我还是很困惑。那么\1+是什么意思?第一组中的一个或多个?如果第一组(第一个字符)后面跟不上同一个字符怎么办?