2010-04-04 69 views
0

我想使用Python和正则表达式计算包含在C代码中的评论字符,但没有成功。我可以先删除字符串以摆脱字符串中的注释,但是这也会在注释中删除字符串,并且结果将会很糟糕。有没有机会通过使用正则表达式来匹配注释中的字符串,反之亦然?在评论中的字符串和字符串的评论

+1

这是不应该使用正则表达式的东西之一,我相信 – 2010-04-04 20:47:09

回答

6

不,不是真的。

正则表达式不是像你描述的那样解析嵌套结构的正确工具;相反,你需要解析C语法(或者你感兴趣的“哑子”),你可能会发现正则表达式有帮助。一个相对简单的具有三种状态(CODE,STRING,COMMENT)的状态机就可以做到。

+2

您可能需要字符常量的第四个状态。在C中,文本“/ *”是一个多字符字符常量;它有未定义或实现定义的行为,但不会发起评论。 – 2010-04-04 20:58:49

2

可以去掉,通过搜索的正则表达式是不评论的所有字符串:

'[^'\r\n]+'|(//.*|/\*(?s:.*?)\*/) 

,并替换:

$1 

从本质上讲,这个搜索正则表达式string|(comment)这匹配字符串或注释,捕获注释。如果匹配字符串,或者评论匹配,那么替换或者不是。

尽管正则表达式不能替代真正的解析器,但您可以通过创建一个巨大的正则表达式来交替所有您感兴趣的令牌(本例中为注释和字符串),从而快速构建一个基本的解析器。如果您要编写一些代码来处理注释,但不是字符串中的代码,请遍历上述正则表达式的所有匹配项,并在第一个捕获组中参与匹配时对其中的字符进行计数。