0

我必须从大量的 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 可以是大写字母或数字,没有规律名字!它们是预处理器的指令,我必须将它们过滤掉

4

1 回答 1

3

使用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\)更改 为^\)

更新 答案中未显示某些退格键。保留字符,例如:[]{}()等必须转义。修正了答案。可能错过了一两个,在那种情况下很抱歉。

更新 05.03.2020 @gregn3 在评论中提供了更新版本,允许#在后面的单词之间使用空格。

([#!][ \t]*[A-z]{2,}[\s]{1,}?([A-z]{2,}[\s]{1,}?)?)([\\(]?[^\s\\)]{1,}[\\)]?)?
于 2017-02-09T14:41:55.560 回答