使用正则表达式筛选预处理器指令
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>
。
欢迎提出任何建议!
EDIT正如有人指出的,我的名字(带括号<>
)只是一个占位符,实际上它可以是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,}[\)]?)?
快速解释:
匹配(大多数)以'#'或'!'开头的字符串,以及一项指令。还允许使用第二个单词,忽略空白(它将与n空白匹配或不匹配)
([\(]?[^\s\)]{1,}[\)]?)?
将同时匹配带括号和无括号的字符串。如果括号内有空格,则不匹配。
如果要匹配括号内的空白,请将^\s\)更改为^)
更新一些退格没有显示在答案中。必须转义保留字符,例如:[]{}()等。修正了答案。可能错过了一两个,对不起。
更新05.03.2020@gregn3在注释中提供了一个更新版本,允许在#
和以下单词之间使用空格。
([#!][ t]*[A-z]{2,}[s]{1,}?([A-z]{2,}[s]{1,}?)?)([\(]?[^s\)]{1,}[\)]?)?
相关文章:
- 如何在编译时定义C++预处理器指令的值?
- 如何在 c++ 预处理器指令中使用 "#" 作为字符
- 有C++标准库 ifdef 或 ifndef 预处理器指令吗?
- 不能在预处理器指令中使用 printf
- ARMC6忽略预处理器指令
- 是否可以转换预处理器指令中的字符?
- 如何使用C++中的处理器指令来实现快速算术运算
- 用于在运行时选择变量的 C++ 预处理器指令
- 如何使用预处理器指令包含两次具有不同代码的文件?
- 将预处理器指令作为语句的一部分
- C++ 预处理器指令函数
- 如何在整个编辑中遵循预处理器指令
- Bullet Physics源代码未在X86中构建 - Visual Studio 2017中错误的预处理器指令
- 预处理器指令:为什么使用#Define的标题文件标识符与标头文件名不同
- 使用正则表达式筛选预处理器指令
- 该预处理器指令在这里可以接受
- 将使用预处理器指令来定义美元符号表示的内容会导致任何冲突
- 对测试单元使用预处理器指令的相关性
- C++单值枚举与预处理器指令
- 是否有任何预处理器指令控制循环展开