字符串中的注释和注释中的字符串

0 投票
3 回答
1455 浏览
提问于 2025-04-15 21:13

我想用Python和正则表达式来统计C代码中注释里的字符数,但一直没成功。我可以先删除字符串,这样就能去掉字符串里的注释,但这样也会把注释里的字符串删掉,结果当然就不对了。有没有办法用正则表达式来做到不匹配注释中的字符串,或者反过来呢?

3 个回答

2

你可以通过查找一个特定的模式,来去掉所有不在注释里的字符串。

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

然后用下面的内容替换:

$1

简单来说,这个查找的模式是 string|(comment),它会匹配字符串或者注释,并且会把注释部分提取出来。替换的结果是,如果匹配到的是字符串,就替换成空;如果匹配到的是注释,就保留这个注释。

虽然正则表达式不能完全替代真正的解析器,但你可以通过创建一个巨大的正则表达式,快速构建一个简单的解析器,这个正则表达式会交替匹配你感兴趣的所有部分(在这个例子中是注释和字符串)。如果你写了一段代码来处理注释,但不想处理字符串里的注释,可以遍历上面正则表达式的所有匹配结果,如果第一个提取的部分参与了匹配,就统计一下它的字符数。

2

正则表达式并不总是可以替代一个真正的解析器。

6

不,实际上不是这样的。

正则表达式并不是处理你所说的那种嵌套结构的合适工具;相反,你需要解析C语言的语法(或者说你感兴趣的那部分简单语法),在这个过程中正则表达式可能会对你有帮助。其实,使用一个相对简单的状态机,设置三个状态(代码、字符串、注释),就可以完成这个任务。

撰写回答