2008-09-10 52 views
4

我一直试图找出一个正则表达式,以允许我自动跳过评论时搜索特定的字符串。任何人都有这样的知识产权或知道一个?它甚至不需要足够复杂以跳过#if 0块;我只是想让它跳过///*块。相反,这只是在评论块内搜索,也是非常有用的。正则表达式的开发人员

环境:VS 2003

回答

3

这比它也许起初出现,因为你需要考虑字符串内注释标记一个困难的问题,注释标记被自己注释掉等

我写了一个用于C#的字符串和注释解析器,让我看看是否可以挖掘出一些有用的东西......如果我找到任何东西,我会更新。

编辑: ...好吧,所以我找到了我的旧'codemasker'项目。原来,我是分阶段做到这一点,而不是一个正则表达式。基本上我通过一个源文件寻找开始令牌,当我找到一个我然后寻找一个结束令牌并掩盖它们之间的所有内容。这考虑到了开始令牌的上下文......如果你找到了“字符串开始”令牌,那么你可以安全地忽略注释令牌,直到找到字符串的结尾,反之亦然。一旦代码被屏蔽(我使用GUID作为掩码,并使用散列表来跟踪),那么你可以安全地进行搜索和替换,最后恢复被屏蔽的代码。

希望有所帮助。

2

对字符串要特别小心。字符串通常有转义序列,当你发现它们结束时,你也必须尊重它们。

因此,例如, "This is \"a test\""。你不能盲目寻找一个双引号来终止。还要小心“`”这是\“`,这表明你不能只是说”除非双引号之前加反斜杠。“

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

1

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

2

正则表达式不是该工作的最佳工具。

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; 
+0

这FAQ链接已经死了。我认为它已经在[这里](http://perldoc.perl.org/perlfaq6.html#How-do-I-use-a-regular-expression-to-strip-C-style-comments-from-a -file%3f) – 2011-04-28 04:31:46