我一直在尝试找出一个正则表达式,以允许我在自动跳过注释的同时搜索特定字符串。有人有这样的 RE 或知道这样的 RE 吗?它甚至不需要复杂到可以跳过 #if 0 块;我只是想让它跳过 ///* 块。相反,即仅在注释块内搜索,也将非常有用。

环境:对比2003年

有帮助吗?

解决方案

这是一个比乍一看更难的问题,因为您需要考虑字符串内的注释标记、本身被注释掉的注释标记等。

我为 C# 编写了一个字符串和注释解析器,让我看看是否可以找出一些有帮助的东西......如果我发现任何东西,我会更新。

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

希望有帮助。

其他提示

对于字符串要特别小心。字符串通常具有转义序列,当您找到它们的结尾时也必须遵守这些转义序列。

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

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

正则表达式并不是完成这项工作的最佳工具。

Perl 常见问题解答:

C评论:

#!/usr/bin/perl
$/ = undef;
$_ = <>; 

s#/\*[^*]*\*+([^/*][^*]*\*+)*/|([^/"']*("[^"\\]*(\\[\d\D][^"\\]*)*"[^/"']*|'[^'\\]*(\\[\d\D][^'\\]*)*'[^/"']*|/+[^*/][^/"']*)*)#$2#g;
print; 

C++ 评论:

#!/usr/local/bin/perl
$/ = undef;
$_ = <>;

s#//(.*)|/\*[^*]*\*+([^/*][^*]*\*+)*/|"(\\.|[^"\\])*"|'(\\.|[^'\\])*'|[^/"']+#  $1 ? "/*$1 */" : $& #ge;
print;

我会先复制一份并删除注释,然后以常规方式搜索字符串。

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