perl匹配可选的正则表达式

时间:2013-03-19 23:40:38

标签: regex 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”之后的任何内容)。关于我做错了什么的想法?

1 个答案:

答案 0 :(得分: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