正規表現の先読み抑制
例えばこんな文字列
hogestring[% hoge1 %]a[% hoge2 %]hey
から[% %]で囲まれてるものを全て取り出して表示するとする。
最終的に1行で書けました。
map {print "$_\n"} ('hogestring[% hoge1 %]a[% hoge2 %]hey' =~ /(\[\%.+?\%\])/g);
ちょっと読み難いので2行が妥当かな
my $str = 'hogestring[% hoge1 %]a[% hoge2 %]hey'; map {print "$_\n"} ($str =~ /(\[\%.+?\%\])/g);
ポイントは正規表現の部分
"?"で先読みを抑制したらうまくいきました。
"?"をつけないと"[% hoge1 %]a[% hoge2 %]"にマッチしてしまう。
このパターンを書くのにかなりの時間がかかってしまった。まだまだ要修行