我一直在尝试找出一个正则表达式来允许我在自动跳过评论的同时搜索特定的字符串。任何人有这样的RE或知道一个吗?它甚至不需要复杂到可以跳过#if 0
块;我只是希望它跳过//
并/*
阻止。相反,仅在注释块内搜索,也将非常有用。
环境:VS 2003
我一直在尝试找出一个正则表达式来允许我在自动跳过评论的同时搜索特定的字符串。任何人有这样的RE或知道一个吗?它甚至不需要复杂到可以跳过#if 0
块;我只是希望它跳过//
并/*
阻止。相反,仅在注释块内搜索,也将非常有用。
环境:VS 2003
这是一个比最初看起来更难的问题,因为您需要考虑字符串中的注释标记、本身被注释掉的注释标记等。
我为 C# 编写了一个字符串和注释解析器,让我看看我是否可以挖掘出一些有用的东西......如果我发现任何东西,我会更新。
编辑:...好的,所以我找到了我的旧“codemasker”项目。事实证明,我是分阶段进行的,而不是使用单个正则表达式。基本上,我通过一个源文件来寻找开始标记,当我找到一个时,我会寻找一个结束标记并掩盖其间的所有内容。这考虑了开始标记的上下文......如果您找到“字符串开始”的标记,那么您可以安全地忽略注释标记,直到找到字符串的结尾,反之亦然。一旦代码被屏蔽(我使用 guid 作为掩码,并使用哈希表来跟踪),您就可以安全地进行搜索和替换,然后最终恢复被屏蔽的代码。
希望有帮助。
使用字符串时要特别小心。字符串通常具有转义序列,您在查找它们的结尾时也必须尊重这些序列。
所以例如"This is \"a test\""
。您不能盲目地寻找双引号来终止。还要注意 `"This is \"`,这表明你不能只说“除非双引号前面有反斜杠”。
总之,做一些残酷的单元测试!
正则表达式不是完成这项工作的最佳工具。
C 评论:
#!/usr/bin/perl
$/ = undef;
$_ = <>;
s#/\*[^*]*\*+([^/*][^*]*\*+)*/|([^/"']*("[^"\\]*(\\[\d\D][^"\\]*)*"[^/"']*|'[^'\\]*(\\[\d\D][^'\\]*)*'[^/"']*|/+[^*/][^/"']*)*)#$2#g;
print;
C++ 评论:
#!/usr/local/bin/perl
$/ = undef;
$_ = <>;
s#//(.*)|/\*[^*]*\*+([^/*][^*]*\*+)*/|"(\\.|[^"\\])*"|'(\\.|[^'\\])*'|[^/"']+# $1 ? "/*$1 */" : $& #ge;
print;
我会先复制并删除评论,然后以常规方式搜索字符串。