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