[英]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.