题
我正在寻找能找到重复字母的正则表达式。所以任何两次或更多的字母,例如:
booooooot or abbott
我不会提前知道我要找的那封信。
这是我在采访中被问到的问题,然后在采访中被问到。没有那么多人认真对待。
解决方案
您可以找到任何字母,然后使用 \ 1
来第二次(或更多)找到相同的字母。如果您只需要知道这封信,那么 $ 1
将包含它。否则,您可以将第二个匹配连接到第一个匹配。
my $str = "Foooooobar";
$str =~ /(\w)(\1+)/;
print $1;
# prints 'o'
print $1 . $2;
# prints 'oooooo'
其他提示
我认为你真的想要这个而不是“\ w”因为这包括数字和下划线。
([a-zA-Z])\1+
好的,好的,我可以暗示Leon。将此用于unicode-world或posix的东西。
([[:alpha:]])\1+
我认为使用反向引用会起作用:
(\w)\1+
\ w
基本上是 [a-zA-Z_0-9]
所以如果你只想匹配A和Z之间的字母(不区分大小写),请使用 [a-zA-Z]
而不是。
(编辑:或者,就像Tanktalus在评论中提到的那样(以及其他人也回答过), [[:alpha:]]
,是区域敏感的)
使用\ N来引用以前的组:
/(\w)\1+/g
您可能需要注意被认为是字母的内容,这取决于您的语言环境。使用ISO Latin-1将允许重音的西方语言字符匹配为字母。在以下程序中,默认语言环境无法识别é,因此 créé 无法匹配。取消注释区域设置代码,然后它开始匹配。
另请注意\ w包括数字和下划线字符以及所有字母。要获得字母,您需要使用非字母,数字和下划线字符的补码。这只留下字母。
通过将其定义为“什么正则表达式匹配除3之外的任何数字?”这个问题可能更容易理解,答案是/ [^ \ D3] /。
#! /usr/local/bin/perl
use strict;
use warnings;
# uncomment the following three lines:
# use locale;
# use POSIX;
# setlocale(LC_CTYPE, 'fr_FR.ISO8859-1');
while (<DATA>) {
chomp;
if (/([^\W_0-9])\1+/) {
print "您可能需要注意被认为是字母的内容,这取决于您的语言环境。使用ISO Latin-1将允许重音的西方语言字符匹配为字母。在以下程序中,默认语言环境无法识别&#233;,因此 cr&#233;&#233; 无法匹配。取消注释区域设置代码,然后它开始匹配。
另请注意\ w包括数字和下划线字符以及所有字母。要获得字母,您需要使用非字母,数字和下划线字符的补码。这只留下字母。
通过将其定义为“什么正则表达式匹配除3之外的任何数字?”这个问题可能更容易理解,答案是/ [^ \ D3] /。
<*>: dup [$1]\n";
}
else {
print "您可能需要注意被认为是字母的内容,这取决于您的语言环境。使用ISO Latin-1将允许重音的西方语言字符匹配为字母。在以下程序中,默认语言环境无法识别&#233;,因此 cr&#233;&#233; 无法匹配。取消注释区域设置代码,然后它开始匹配。
另请注意\ w包括数字和下划线字符以及所有字母。要获得字母,您需要使用非字母,数字和下划线字符的补码。这只留下字母。
通过将其定义为“什么正则表达式匹配除3之外的任何数字?”这个问题可能更容易理解,答案是/ [^ \ D3] /。
<*>: nope\n";
}
}
__DATA__
100
food
créé
a::b
以下代码将返回所有重复两次或更多次的字符。
my $ str =&quot; SSSannnkaaarsss&quot;;
打印$ str =〜/(\ w)\ 1 + / g;
只是为了踢,一种完全不同的方法:
if ( ($str ^ substr($str,1) ) =~ /\0+/ ) {
print "found ", substr($str, $-[0], <*>[0]-$-[0]+1), " at offset ", $-[0];
}
仅供参考,除了RegExBuddy,一个真正方便的免费网站用于测试正则表达式是 Regexr at gskinner.com 。很好地处理([[:alpha:]])(\ 1 +)
。
怎么样:
(\w)\1+
第一部分围绕一个角色创建一个未命名的组,然后反向引用查找相同的角色。
我认为这也应该有效:
<代码>((\ w)的(?= \ 2))+ \ 2 代码>
/(.)\\1{2,}+/u
'u'修饰符与unicode匹配