0

文字列をオプションのプレフィックスとサフィックスと一致させるために、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」の後のすべて)と一致します。私が間違ったことについて何か考えはありますか?

4

1 に答える 1

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
于 2013-03-19T23:55:56.483 に答える