Regex 什么正则表达式可以匹配相同字符的序列?
一位朋友问我这个问题,我被难住了:有没有一种方法可以设计一个正则表达式来匹配相同字符的序列?例如,匹配“aaa”、“bbb”,但不匹配“abc”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+ 这就是反向
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+是什么意思?第一组中的一个或多个?如果第一组(第一个字符)后面跟不上同一个字符怎么办?