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

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>

我要取回所有的NAME,但并不是都是XXX的形式,因为项目的程序员不同,所以定义很多,所以我在定义一个正则表达式时遇到问题,该正则表达式只能从刚才描述的每种情况中推断 <NAME>

如有任何建议,我们将不胜感激!

编辑 正如有人指出的那样,我的 NAME (带有 surrondings < )只是一个占位符,实际上它可以是 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,}[\)]?)?

快速解释:

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

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

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

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

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

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

更新 05.03.2020 @gregn3 在评论中提供了一个更新版本,它允许 # 和后面的词之间有空格。

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