Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用Perl正则表达式查找重复的字母?_Regex_Perl_Character - Fatal编程技术网

Regex 如何使用Perl正则表达式查找重复的字母?

Regex 如何使用Perl正则表达式查找重复的字母?,regex,perl,character,Regex,Perl,Character,我正在寻找一个正则表达式,可以找到重复的字母。因此,任何两次或两次以上的字母,例如: booooooot or abbott 我不会提前知道我要找的信 这是我在采访中被问到的一个问题,然后在采访中被问到。没有那么多人正确理解它。请使用\N来参考以前的组: /(\w)\1+/g 那么: (\w)\1+ 第一部分围绕一个字符创建一个未命名的组,然后反向引用查找同一个字符。我认为使用反向引用可以: (\w)\1+ \w基本上是[a-zA-Z_0-9]因此,如果您只想匹配a和Z之间的字母(不区分

我正在寻找一个正则表达式,可以找到重复的字母。因此,任何两次或两次以上的字母,例如:

booooooot or abbott
我不会提前知道我要找的信


这是我在采访中被问到的一个问题,然后在采访中被问到。没有那么多人正确理解它。

请使用\N来参考以前的组:

/(\w)\1+/g
那么:

(\w)\1+

第一部分围绕一个字符创建一个未命名的组,然后反向引用查找同一个字符。

我认为使用反向引用可以:

(\w)\1+
\w
基本上是
[a-zA-Z_0-9]
因此,如果您只想匹配a和Z之间的字母(不区分大小写),请使用
[a-zA-Z]


(编辑:或者,像Tanktalus在他的评论中提到的(以及其他人的回答),
[:alpha:]
,这是地区敏感的)

您可以找到任何字母,然后使用
\1
第二次(或更多次)找到相同的字母。如果您只需要知道字母,则
$1
将包含它。否则,可以将第二个匹配项连接到第一个匹配项上

my $str = "Foooooobar";

$str =~ /(\w)(\1+)/;

print $1;
# prints 'o'
print $1 . $2;
# prints 'oooooo'

我认为您实际上想要这个而不是“\w”,因为它包括数字和下划线

([a-zA-Z])\1+
好吧,好吧,我可以接受一个暗示,里昂。将其用于unicode世界或posix

([[:alpha:]])\1+

您可能需要注意什么是字母,这取决于您所在的地区。使用ISO拉丁语-1将允许重音西方语言字符匹配为字母。在下面的程序中,默认语言环境不识别é,因此cré无法匹配。取消对区域设置代码的注释,然后它开始匹配

还要注意\w包括数字和下划线字符以及所有字母。要仅获取字母,需要获取非字母数字、数字和下划线字符的补码。这只留下字母

如果将其定义为以下问题,可能更容易理解:

“什么正则表达式匹配除3以外的任何数字?”
答案是:
/[^\D3]/

#/usr/local/bin/perl
严格使用;
使用警告;
#取消注释以下三行:
#使用区域设置;
#使用POSIX;
#setlocale(LC_CTYPE,'fr_fr.ISO8859-1');
而(){
咀嚼;
如果(/([^\W_0-9])\1+/){
打印“$\:dup[$1]\n”;
}
否则{
打印“$\:否\n”;
}
}
__资料__
100
食物
克雷
a::b

以下代码将返回所有重复两次或更多次的字符:

my $str = "SSSannnkaaarsss";

print $str =~ /(\w)\1+/g;

仅供参考,除了RegExBuddy之外,还有一个真正方便的免费正则表达式测试站点。处理
([[:alpha:]](\1+)
很好。

仅用于踢腿,一种完全不同的方法:

if ( ($str ^ substr($str,1) ) =~ /\0+/ ) {
    print "found ", substr($str, $-[0], $+[0]-$-[0]+1), " at offset ", $-[0];
}

我认为这也应该起作用:

((\w)(?=\2))+\2


与unicode匹配的“u”修饰符将[a-zA-Z]中的字母替换为\w。现在,我可以将一个字母替换为双字母:Regex.replace(str,@“(\w)\1+”,“$1”);谢谢你,亚当。这只匹配前两个重复字符,而不是整个重复子字符串。我们生活在一个unicode世界。[a-zA-Z]不会涵盖大多数语言。[:alpha:]更正确。哦,你们这些疯狂的外国人;o) 是的,unicode对于非美国英语字符来说是一种更好的语法。是的,它也会找到非字母。但是你能找到微妙的bug吗?不要使用[a-zA-Z],只需使用[[:alpha:]这是区分区域设置的;-)
if ( ($str ^ substr($str,1) ) =~ /\0+/ ) {
    print "found ", substr($str, $-[0], $+[0]-$-[0]+1), " at offset ", $-[0];
}
/(.)\\1{2,}+/u