我的工作是分析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 / %%([^%] +)%% //克;

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top