题
我的工作是分析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
注意第二个替代如何停止只要它遇到的“y”相匹配。该*?量词有效地告诉正则表达式引擎,以尽快找到一个匹配以及通过控制线旁无论是喜欢你,如果你正在玩烫手山芋。
假设你已经阅读整个代码到变量$ STR之间%%和%%没有单个%发生的文化可能性,可以使用此操作。
$ STR =〜S / %%([^%] +)%% //克;
不隶属于 StackOverflow