对于与工具的合并,我只需要比较源代码行的未注释部分。
所以我尝试创建一个过滤器来检测实际代码,即一个匹配除注释之外的所有文本的正则表达式。
也许是这样的:
^.*(?!((/\**([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)))
这个会做:
(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)
来源: http: //ostermiller.org/findcomment.html。
或使用非贪婪匹配 : (/\*([\r\n]|.)*?\*/)|(//.*)
。
Amine 的回答是正确的,但您也可以找到任何评论并将其从字符串中删除:
这个正则表达式会给你所有的评论:
(/\*.*?\*/)|//.*?\n
这将用“”替换匹配项(如果您使用的是 c++):
std::string str2 = std::tr1::regex_replace(string, regex, "");
也许您的编译器可以提供帮助。有些人可能会选择预处理源代码和去除注释。也许可以使预处理器只去除注释。这将是让一个工具正确完成一件事的 Unix 方式——C 预处理器知道注释是什么(而 regexen 是用于解析的工具,IMNSHO)。
作为第二种选择,编写带有lex
或flex
识别注释的词法分析器很容易。网上应该有很多例子。任何搜索引擎都会出现大量点击。
对于多行注释,请使用:
/\/\*([\s\S]*?)\*\//mg
并用于匹配单行注释:
/\/\/([\s\S]*?)[\n\r]?$/mg
或将这两者结合起来以匹配所有评论
/(\/\*(?<multiline>[\s\S]*?)\*\/)|(\/\/(?<singleline>[\s\S]*?)[\n\r]?$)/mg