我很难在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 :(得分: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