2013-11-24 27 views
0

假设我有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

+3

'2f'是否为有效匹配? –

+0

'\ w'已经包含数字'\ d',这意味着你也可以得到字母和数字的混合匹配,比如上面提到的那个'2f'。您需要决定是否有效匹配。另外,'[\ d \ d]'是一个冗余表达式,简化为'\ d'。 – TLP

+0

没有它没有一个有效的匹配只有提示,我的意思是我修改了问题 – smith

回答

2

试试这个:

^(([A-Za-z]{2}|\d\d),)*([A-Za-z]{2}|\d\d)$ 

Tested on regexe

得到如下结果:

Result

+0

紧接在'\ d \ d'附近的括号是多余的,否则为+1。 –

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 
0

下面是一个使用/^(?:[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 

希望这有助于!

+0

使逗号可选将允许像“aaaa”或“22aa”这样的字符串匹配(长度可以被2除)。 – TLP

+0

@TLP - 感谢您的正则表达式问题。已转贴我的原始解决方案。 – Kenosis

0

您可以使用此:

^((?>[a-z]{2}|[0-9]{2})(?>,(?1)|$)) 

或者这个:

^(?>(?>[a-z]{2}|[0-9]{2})(?>,|$))+$ 
0

在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