假设我有2个正则表达式[\d\d]
和[a-zA-Z][a-zA-Z]
我想检查一个字符串是否有任何数量和顺序的模式,只有那些用逗号分隔的模式我怎么能这样做用perl?与perl正则表达式发生2模式匹配
例如字符串
ex,xy,gf,55,66-> match
例如字符串
22,24,25,56,ff ->match
例如字符串
2FF,24,25,56,ff -> not match
假设我有2个正则表达式[\d\d]
和[a-zA-Z][a-zA-Z]
我想检查一个字符串是否有任何数量和顺序的模式,只有那些用逗号分隔的模式我怎么能这样做用perl?与perl正则表达式发生2模式匹配
例如字符串ex,xy,gf,55,66-> match
例如字符串22,24,25,56,ff ->match
例如字符串2FF,24,25,56,ff -> not match
紧接在'\ d \ d'附近的括号是多余的,否则为+1。 –
#!/usr/bin/perl
use warnings;
use strict;
my $pattern1 = '\d';
my $pattern2 = '[a-zA-Z]';
my $string = ('ex,xy,gf,55,66');
my $warning = 0;
my @split = split(/,/, $string);
foreach (@split){
unless (($_ =~ /^$pattern1{2}$/) or ($_ =~ /^$pattern2{2}$/)) {
$warning++;
}
}
print "$string -> match\n" if ($warning == 0);
print "$string -> no match" if ($warning != 0);
输出:
ex,xy,gf,55,66 -> match
同样的代码,不同的字符串:
my $string = ('22,2f,ex,xy,gf,2FF');
输出:
22,2f,ex,xy,gf,2FF -> no match
下面是一个使用/^(?:[a-z]{2},?|\d\d,?)+$/i
一个选项:
use strict;
use warnings;
while (<DATA>) {
chomp;
my @elems = split /,/;
my @match = grep /^(?:\d{2}|[a-z]{2})$/i, @elems;
print "$_ -> ", (@elems == @match ? '' : 'not '), "match\n"
}
__DATA__
ex,xy,gf,55,66
22,24,25,56,ff
2FF,24,25,56,ff
输出:
ex,xy,gf,55,66 -> match
22,24,25,56,ff -> match
2FF,24,25,56,ff -> not match
希望这有助于!
您可以使用此:
^((?>[a-z]{2}|[0-9]{2})(?>,(?1)|$))
或者这个:
^(?>(?>[a-z]{2}|[0-9]{2})(?>,|$))+$
在Perl中玩弄这个之后,我想出了这个。
我测试了Perl中发布的所有答案。这些问题来自于尝试匹配非常大的字符串
。主要是> 256 K. Perl似乎找不到匹配项,其中
的尺寸较小,但它确实如此。也许它是我没有使用的设置,我不知道。
Casimir的递归正则表达式是个例外,它需要一分钟的时间才能匹配一个3兆bufffer。
因此,对于咧嘴笑,我把一个正则表达式匹配所允许的负数。
15兆缓冲区在我的机器上最多需要10秒,具体取决于故障(匹配)
是什么时间,或者如果通过,则为10秒。值得注意的是,没有捕获信息的积累,也许这就是为什么它可以处理大型缓冲区。
$test = "ex,xy,gt,55,66,";
for (0 .. 19) { $test .= $test; }
$test .= "3a3";
print "\nlength = ", length($test), "\n------------\n";
if ($test =~ m/
# \d(?:[a-z]|\d{2})|[a-z](?:\d|[a-z]{2})|[^a-z\d,]|,(?:.?,|$)|^,
\d
(?: [a-z] | \d{2})
|
[a-z]
(?: \d | [a-z]{2})
|
[^a-z\d,]
|
,
(?: .? , | $)
|
^,
/xg)
{ print "Found error at pos = ", pos($test), "\n"; }
else
{ print "Passed test!\n"; }
__END__
Output >>
length = 15728643
------------
Found error at pos = 15728642
'2f'是否为有效匹配? –
'\ w'已经包含数字'\ d',这意味着你也可以得到字母和数字的混合匹配,比如上面提到的那个'2f'。您需要决定是否有效匹配。另外,'[\ d \ d]'是一个冗余表达式,简化为'\ d'。 – TLP
没有它没有一个有效的匹配只有提示,我的意思是我修改了问题 – smith