一位朋友问我这件事,我感到难过:有没有办法制作一个匹配同一个角色序列的正则表达式?例如,匹配'aaa','bbb',但不是'abc'?
m|\w{2,3}|
不会这样做,因为它会匹配'abc'。
m|a{2,3}|
不会这样做,因为它不会匹配'bbb','ccc'等。
答案 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!");
}
}
}