繁体   English   中英

使用正则表达式过滤预处理器指令?

[英]Using regex to filter for preprocessor directives?

我必须从大量的 cpp 文件中过滤掉所有定义的宏,不包括守卫,例如:

#if <NAME>
#ifdef <NAME>
#ifndef <NAME>
#if defined(<NAME>)
#if defined <NAME>
!defined(<NAME>)
!defined <NAME>
#else if <NAME>
#elif <NAME>

我必须检索所有名称,但它们并非全部采用XXX形式,因为不同的程序员在项目上工作,有很多定义,所以我在定义只能提取<NAME>的正则表达式时遇到问题从刚才描述的每一种情况。

任何建议表示赞赏!

编辑正如有人指出的那样,我的 NAME (带有尖括号<> )只是一个占位符,实际上它可以是XXXX , XXXX, XX_Y , _XXX, _XXX_Y, XXYY 其中 X 和 Y 可以是大写字母或数字,名字没有规律性。 它们是预处理器的指令,我必须将它们过滤掉。

使用http://regexr.com和您提供的示例快速测试了这一点。 匹配大多数情况。

您可能需要稍微改进一下。

([#!][A-z]{2,}[\s]{1,}?([A-z]{2,}[\s]{1,}?)?)([\\(]?[^\s\\)]{1,}[\\)]?)?

快速解释:

([#,][Az]{2,}[\s]{1?},([Az]{2,}[\s]{1?}?)?)

匹配(大多数)以“#”或“,”开头的字符串。 和一个指令,第二个词也被允许,空格被忽略(它将匹配有和没有n空格)

([\(]?[^\s\)]{1,}[\)]?)?

将匹配括号内和非括号内的字符串。 如果括号内有空格,则不会匹配。

如果要匹配括号内的空格,请将^\s\)更改为^\)

更新一些退格键没有显示在答案中。 保留字符,例如: []{}()等必须转义。 修复了答案。 可能错过了一两个,抱歉。

2020 年 3 月 5 日更新@gregn3 在评论中提供了一个更新版本,允许在#和后面的单词之间使用空格。

([#!][ \t]*[A-z]{2,}[\s]{1,}?([A-z]{2,}[\s]{1,}?)?)([\\(]?[^\s\\)]{1,}[\\)]?)?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM