代码之家  ›  专栏  ›  技术社区  ›  Onorio Catenacci

开发人员用regex

  •  4
  • Onorio Catenacci  · 技术社区  · 17 年前

    我一直试图找到一个regex,允许我在自动跳过注释的同时搜索特定的字符串。有没有人有这样的回复或者知道?它甚至不需要足够复杂来跳过 #if 0 街区;我只是想让它跳过 // /* 阻碍。相反,只在注释块内搜索,也非常有用。

    环境:与2003年相比

    4 回复  |  直到 8 年前
        1
  •  3
  •   Ed Guiness    17 年前

    这是一个比最初可能出现的问题更难解决的问题,因为您需要考虑字符串中的注释标记、注释标记本身被注释掉等等。

    我为C编写了一个字符串和注释分析器,让我看看是否可以挖掘出一些有用的东西…如果有发现我会更新的。

    编辑: …好吧,所以我找到了我以前的“代码屏蔽”项目。结果证明我是分阶段做的,不是用一个正则表达式。基本上,我浏览一个源文件,寻找开始标记,当我找到一个时,我就寻找结束标记,并屏蔽其中的所有内容。这考虑到启动令牌的上下文…如果您找到了“字符串开始”的标记,那么可以安全地忽略注释标记,直到找到字符串的结尾,反之亦然。一旦代码被屏蔽(我使用guid作为屏蔽,并使用hashtable来跟踪),那么您就可以安全地进行搜索和替换,最后恢复被屏蔽的代码。

    希望有帮助。

        2
  •  2
  •   Jason Cohen    17 年前

    特别小心绳子。字符串通常有转义序列,在查找它们的结尾时,也必须尊重这些转义序列。

    因此,例如 "This is \"a test\"" . 你不能盲目地寻找双引号来终止。还要注意“这是”,这表明你不能只说“除非双引号前面有反斜杠”。

    总之,做一些残酷的单元测试!

        3
  •  2
  •   jfs    15 年前

    regexp不是该作业的最佳工具。

    Perl FAQ :

    C评论:

    #!/usr/bin/perl
    $/ = undef;
    $_ = <>; 
    
    s#/\*[^*]*\*+([^/*][^*]*\*+)*/|([^/"']*("[^"\\]*(\\[\d\D][^"\\]*)*"[^/"']*|'[^'\\]*(\\[\d\D][^'\\]*)*'[^/"']*|/+[^*/][^/"']*)*)#$2#g;
    print; 
    

    C++注释:

    #!/usr/local/bin/perl
    $/ = undef;
    $_ = <>;
    
    s#//(.*)|/\*[^*]*\*+([^/*][^*]*\*+)*/|"(\\.|[^"\\])*"|'(\\.|[^'\\])*'|[^/"']+#  $1 ? "/*$1 */" : $& #ge;
    print;
    
        4
  •  1
  •   asksol    17 年前

    我会做一份副本,先去掉注释,然后按常规方式搜索字符串。