对于与工具的合并,我需要仅比较源代码行的未评论部分。
所以我尝试创建一个检测实际代码的过滤器,即一个匹配所有文本 EXCEPT 注释的正则表达式。
也许是这样的:
^.*(?!((/\**([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)))
答案 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)。
作为第二种选择,编写带有lex
或flex
的词法分析器来识别注释很容易。 '网上应该有很多例子。任何搜索引擎都会出现大量点击。
答案 3 :(得分:0)
对于多行注释,请使用:
/\/\*([\s\S]*?)\*\//mg
并用于匹配单行注释:
/\/\/([\s\S]*?)[\n\r]{1}/mg
或将两者结合以匹配所有注释
/(\/\*(?<multiline>[\s\S]*?)\*\/)|(\/\/(?<singleline>[\s\S]*?)[\n\r]{1})/mg