2013-03-19 3 views
0

Я изо всех сил пытаюсь придумать регулярное выражение в Perl, чтобы соответствовать строке с необязательными префиксами и суффиксами.perl matching optional regex

Вот мое выражение до сих пор:

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

ответ

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