2013-03-19 133 views
0

我很努力想在Perl中使用正则表达式来匹配带有可选前缀和后缀的字符串。perl匹配可选正则表达式

这里是我的表情至今:

my $string = "prefix1_foo_suffix2"; 
if ($string =~ m/^(prefix1_|prefix2_)?(prefix3_|prefix4_)?foo|bar(_suffix1|_suffix2)?$/) { 
    print "match" 
}; 

所以这应该匹配字符串像

prefix1_foo_suffix2 
prefix1_prefix4_bar 
bar_suffix2 

但不

prefix1_baz_suffix2 
bar_suffix42 

据我所知,虽然,这匹配任何后缀(即:“foo”或“bar”之后的任何内容)。关于我做错了什么想法?

+0

这将是因为它是可选的,换句话说:所有需要匹配的是** foo | bar **和* bar_suffix42 *。但是,如果prefix1_baz_suffix2确实如此,那么我会感到惊讶,因为baz不是您所需匹配的一部分。 – tink 2013-03-19 23:48:16

回答

4

你的正则表达式有优先权问题。此外,对于非捕获组,您应该使用(?:group)

这是你写的:

m/ (?:^(?: prefix1_ | prefix2_)? (?: prefix3_ | prefix4_)? foo) 
    | (?: bar (?: _suffix1 | _suffix2)? $) 
/x 

但你的意思是这样的:

m/ \A 
    (?: prefix1_ | prefix2_)? 
    (?: prefix3_ | prefix4_)? 
    (?: foo  | bar  ) 
    (?: _suffix1 | _suffix2)? 
    \z 
/x 

快速测试:

my $regex = qr/ 
    \A 
    (?: prefix1_ | prefix2_)? 
    (?: prefix3_ | prefix4_)? 
    (?: foo  | bar  ) 
    (?: _suffix1 | _suffix2)? 
    \z 
/x; 
say "$_:\t", ($_ =~ $regex ? "passes" : "doesn't match") for 
    qw/prefix1_foo_suffix2 
    prefix1_prefix4_bar 
    bar_suffix2 
    prefix1_baz_suffix2 
    bar_suffix42 
    /; 

输出:

prefix1_foo_suffix2: passes 
prefix1_prefix4_bar: passes 
bar_suffix2:   passes 
prefix1_baz_suffix2: doesn't match 
bar_suffix42:   doesn't match 
+0

这已经完成了。非常感谢你。 – trubliphone 2013-03-20 02:53:14