2013-03-19 160 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