C++ 正则表达式';为开发者准备的

C++ 正则表达式';为开发者准备的,c++,regex,visual-c++,utilities,C++,Regex,Visual C++,Utilities,我一直在尝试找出一个正则表达式,允许我在自动跳过注释的同时搜索特定字符串。有人有过这样的经历或知道这样的经历吗?它甚至不需要复杂到跳过#如果0个块;我只想让它跳过/和/*块。反之,也就是只在注释块内搜索,也会非常有用 环境:VS 2003 < P>这是一个比最初出现的更难的问题,因为你需要考虑字符串内的注释标记、注释本身的注释标记等。 我为C#编写了一个字符串和注释解析器,让我看看是否可以找出一些有用的东西。。。如果我发现什么,我会更新的 编辑: ... 好的,我找到了我以前的“密码伪装”项目

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


环境:VS 2003

< P>这是一个比最初出现的更难的问题,因为你需要考虑字符串内的注释标记、注释本身的注释标记等。

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

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


希望有帮助。

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

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


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

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

regexp不是执行此任务的最佳工具

:

C评论:

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

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

s#//(.*)|/\*[^*]*\*+([^/*][^*]*\*+)*/|"(\\.|[^"\\])*"|'(\\.|[^'\\])*'|[^/"']+#  $1 ? "/*$1 */" : $& #ge;
print;
#/usr/bin/perl
$/=未定义;
$_ = ; 
s.\/\*[^*]**+([^/*][^*]*\*+)*/\*([^/“]*(“[^”\]*(\\[\d\d][^”\\]*.[^/“]*.[^'\]*(\[\d\d][^\]*.[^/']*.[^/']*.[^/']*.*.[^/']*.*.[^/']*.[^/']*.[^/']*.[^/']*.*.$2$35G;
印刷品;
C++注释:

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

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

s#//(.*)|/\*[^*]*\*+([^/*][^*]*\*+)*/|"(\\.|[^"\\])*"|'(\\.|[^'\\])*'|[^/"']+#  $1 ? "/*$1 */" : $& #ge;
print;
#/usr/local/bin/perl
$/=未定义;
$_ = ;
s./(.*)/*[^*]***+([^/*][^*]***+)*/“(\\.[^”\\])*”(\\.[^”\\])*“(\\.[^'\])*”*“\.[^/”]+\$1?“/*$1*/”:$&#ge;
印刷品;

该常见问题解答链接已关闭。我想它已经移动了