【问题标题】:perl matching optional regexperl 匹配可选的正则表达式
【发布时间】:2013-03-19 23:40:37
【问题描述】:

我正在努力在 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”之后的任何内容)。关于我做错了什么有什么想法吗?

【问题讨论】:

  • 那是因为它是可选的,换句话说:所有需要匹配的是 foo|bar,并且 bar_suffix42 符合条件。但是,如果 prefix1_baz_suffix2 这样做,我会感到惊讶,因为 baz 不是您所需匹配的一部分。

标签: regex perl


【解决方案1】:

您的正则表达式存在优先级问题。此外,对于非捕获组,您应该使用(?: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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    相关资源
    最近更新 更多