私はDSLを分析しているプリプロセッサに取り組んでいます。私の目標は、コメントを削除することです。%%
ブロックコメント機能は前後で区切られています。言語の定義により、 %% が文字列であることを心配する必要はありません。
私はこのs///
正規表現を使用しています。残念ながら、それはすべてに一致し、それを一掃するようです:
#Remove multiline comments.
$text_string =~ s/%%.*%%//msg;
私は何を間違っていますか?
最初にできることは、貪欲でないようにすることです。
.*?
それ以外は、
%% テキスト %%
実際のコンテンツ
%% その他のテキスト %%
すべて消し去られます。
perlfaq6から: 正規表現が貪欲であるとはどういう意味ですか? どうすれば回避できますか?
ほとんどの人は、貪欲な正規表現が可能な限り一致することを意味します。技術的に言えば、実際にはパターン全体ではなく量指定子 (?、*、+、{}) が貪欲です。Perl は、全体的な貪欲よりも、局所的な貪欲と即時の満足を好みます。同じ量指定子の貪欲でないバージョンを取得するには、(??, *?, +?, {}?) を使用します。
例:
$s1 = $s2 = "I am very very cold";
$s1 =~ s/ve.*y //; # I am cold
$s2 =~ s/ve.*?y //; # I am very cold
2 番目の置換が「y」に遭遇するとすぐにマッチングを停止したことに注意してください。*? quantifier は、ホット ポテトをプレイしている場合のように、一致するものをできるだけ早く見つけて、次のものに制御を渡すように正規表現エンジンに効果的に指示します。
コード全体を変数$strに読み込み、%%と%%の間で単一の%が発生する可能性がないと仮定すると、これを使用できます。
$ str =〜s / %%([^%] +)%% // g;