我正在研究分析DSL的預處理器。我的目標是刪除評論。 塊評論設施的前後劃分爲%%
。根據語言的定義,我不必擔心字符串中的%%。我怎樣才能用Perl刪除塊註釋?
我使用這個s///
正則表達式。不幸的是,它似乎匹配一切,並將其擦除:
#Remove multiline comments.
$text_string =~ s/%%.*%%//msg;
我在做什麼錯?
我正在研究分析DSL的預處理器。我的目標是刪除評論。 塊評論設施的前後劃分爲%%
。根據語言的定義,我不必擔心字符串中的%%。我怎樣才能用Perl刪除塊註釋?
我使用這個s///
正則表達式。不幸的是,它似乎匹配一切,並將其擦除:
#Remove multiline comments.
$text_string =~ s/%%.*%%//msg;
我在做什麼錯?
你可以做的第一件事就是讓非貪婪:
.*?
否則,
%%一些文字%%
實際內容
%%其他文字%%
都將被清除。
從perlfaq6: What does it mean that regexes are greedy? How can I get around it?
大多數人意味着貪婪的正則表達式多,因爲他們可以匹配。從技術上講,它實際上是量詞(?,*,+,{}),它們是貪婪的而不是整個模式。 Perl更喜歡本地貪婪,並立即滿足整體貪婪。要獲得相同量詞的非貪婪版本,請使用(??,*?,+ ?, {}?)。
一個例子:
$s1 = $s2 = "I am very very cold";
$s1 =~ s/ve.*y //; # I am cold
$s2 =~ s/ve.*?y //; # I am very cold
通知第二替換如何停止一旦它遇到的「Y」匹配。 *?量詞有效地告訴正則表達式引擎儘可能快地找到匹配,並將控制權交給下一行的任何內容,就像你會玩燙手的土豆一樣。
假設您已經將整個代碼讀入到變量$ str中,並且%%和%%之間沒有發生單個%發生的可能性,您可以使用它。
$ str =〜s/%%([^%] +)%% // g;