过滤器c注释的正则表达式

时间:2012-08-23 10:28:42

标签: c regex

对于与工具的合并,我需要仅比较源代码行的未评论部分。

所以我尝试创建一个检测实际代码的过滤器,即一个匹配所有文本 EXCEPT 注释的正则表达式。

也许是这样的:

^.*(?!((/\**([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)))

4 个答案:

答案 0 :(得分:1)

这个会做:

(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)

来源:http://ostermiller.org/findcomment.html

或使用非贪婪匹配:(/\*([\r\n]|.)*?\*/)|(//.*)

答案 1 :(得分:0)

Amine的回答是对的,但您也可以找到任何评论并将其从字符串中删除:

这个正则表达式会给你所有的评论:

(/\*.*?\*/)|//.*?\n

这将用“”替换匹配(如果您使用的是c ++):

std::string str2 = std::tr1::regex_replace(string, regex, "");

答案 2 :(得分:0)

也许您的编译器可以提供帮助。有些人可能会选择预处理源和剥离注释。也许预处理器可以剥离注释。这将是让一个工具做正确的事情的Unix方式 - C预处理器知道注释是什么(而regexen是解析的一个方法,IMNSHO)。

作为第二种选择,编写带有lexflex的词法分析器来识别注释很容易。 '网上应该有很多例子。任何搜索引擎都会出现大量点击。

答案 3 :(得分:0)

对于多行注释,请使用:

/\/\*([\s\S]*?)\*\//mg

并用于匹配单行注释:

/\/\/([\s\S]*?)[\n\r]{1}/mg

或将两者结合以匹配所有注释 /(\/\*(?<multiline>[\s\S]*?)\*\/)|(\/\/(?<singleline>[\s\S]*?)[\n\r]{1})/mg