perl匹配可选正则表达式
问题描述:
我很努力想在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”之后的任何内容)。关于我做错了什么想法?
答
你的正则表达式有优先权问题。此外,对于非捕获组,您应该使用(?: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
这将是因为它是可选的,换句话说:所有需要匹配的是** foo | bar **和* bar_suffix42 *。但是,如果prefix1_baz_suffix2确实如此,那么我会感到惊讶,因为baz不是您所需匹配的一部分。 – tink 2013-03-19 23:48:16