使用正则表达式筛选预处理器指令

Using regex to filter for preprocessor directives?

本文关键字:处理器 指令 预处理 筛选 正则表达式      更新时间:2023-10-16

我必须从大量的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,}[\)]?)?