正则表达式对于开发人员

时间:2020-03-05 18:50:43  来源:igfitidea点击:

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

环境:VS 2003

解决方案

回答

这个问题比起初看起来要困难得多,因为我们需要考虑字符串内的注释标记,本身被注释掉的注释标记等。

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

编辑:
...好的,所以我找到了我的旧" codemasker"项目。事实证明,我是分阶段进行此操作的,而不是使用单个正则表达式进行的。基本上,我会仔细查看源文件以查找起始令牌,当我找到一个起始令牌时,便会寻找一个结束令牌并掩盖介于两者之间的所有内容。这考虑到了起始标记的上下文...如果我们找到"字符串起始"的标记,则可以放心地忽略注释标记,直到找到字符串的结尾为止,反之亦然。一旦屏蔽了代码(我使用Guids作为屏蔽,并使用哈希表来跟踪),则可以安全地进行搜索和替换,然后最终恢复屏蔽的代码。

希望能有所帮助。

回答

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

所以"这是"测试"。我们不能盲目地寻找双引号来终止。还请注意"这是"`,这表明我们不能只说"除非双引号前面加反斜杠"。

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

回答

我将进行复制并首先删除注释,然后按常规方式搜索字符串。

回答

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

Perl常见问题解答:

C注释:

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

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

C ++注释:

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

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