2009-06-04 21 views
1

我正在研究分析DSL的預處理器。我的目標是刪除評論。 塊評論設施的前後劃分爲%%。根據語言的定義,我不必擔心字符串中的%%。我怎樣才能用Perl刪除塊註釋?

我使用這個s///正則表達式。不幸的是,它似乎匹配一切,並將其擦除:

#Remove multiline comments. 
$text_string =~ s/%%.*%%//msg; 

我在做什麼錯?

回答

9

你可以做的第一件事就是讓非貪婪:

.*? 

否則,

%%一些文字%%

實際內容

%%其他文字%%

都將被清除。

1

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」匹配。 *?量詞有效地告訴正則表達式引擎儘可能快地找到匹配,並將控制權交給下一行的任何內容,就像你會玩燙手的土豆一樣。

0

假設您已經將整個代碼讀入到變量$ str中,並且%%和%%之間沒有發生單個%發生的可能性,您可以使用它。

$ str =〜s/%%([^%] +)%% // g;