我正在研究正在分析DSL的预处理器。我的目标是删除评论。
块注释工具在%%
之前和之后划分。根据语言的定义,我不必担心%%在字符串中。
我正在使用此s///
正则表达式。不幸的是,它似乎与所有东西相匹配并将其消除:
#Remove multiline comments.
$text_string =~ s/%%.*%%//msg;
我做错了什么?
答案 0 :(得分:9)
你能做的第一件事就是让它变得非贪婪:
.*?
,否则
%% some text %%
真实内容
%%其他文字%%
将全部消灭。
答案 1 :(得分: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”后如何停止匹配。 *?量词有效地告诉正则表达式引擎尽快找到匹配并将控制传递给下一行,就像你在玩烫手山芋一样。
答案 2 :(得分:0)
假设您已将整个代码读入变量$ str以及%%和%%之间,则不可能出现单个%,您可以使用它。
$ str = ~s / %%([^%] +)%% // g;