代码之家  ›  专栏  ›  技术社区  ›  Paul Nathan

如何用Perl去除块注释?

  •  1
  • Paul Nathan  · 技术社区  · 16 年前

    我正在研究一个分析DSL的预处理器。我的目标是删除评论。 块注释工具由 %% 之前和之后。根据语言的定义,我不必担心“%”在字符串中。

    我在用这个 s/// 正则表达式不幸的是,它似乎匹配了所有的东西并将其清除:

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

    我做错什么了?

    3 回复  |  直到 16 年前
        1
  •  9
  •   nonopolarity    16 年前

    你能做的第一件事就是让它不贪婪:

    .*?
    

    否则,

    %%some text%%

    真实内容

    其他文本百分比

    都会被消灭。

        2
  •  1
  •   brian d foy    16 年前

    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”时如何停止匹配。那个*?量词有效地告诉正则表达式引擎尽快找到匹配项,并将控制权传递给下一行中的任何内容,就像您在玩“烫手山芋”一样。

        3
  •  0
  •       16 年前

    假设您已将整个代码读取到变量$str中,%和%之间,则不可能出现单个%的情况,您可以使用此方法。

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

    推荐文章