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

时间:2017-02-09 14:28:58

标签: c++ regex c-preprocessor preprocessor-directive ifdefine

我必须从大量的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&lt;)只是一个占位符,实际上它可以是 XXXX ,XXXX,_XX_Y _,_ XXX,_XXX_Y,XXYY其中X和Y可以是大写字母或数字,名称没有规律!它们是预处理器的指令,我必须将它们过滤掉

1 个答案:

答案 0 :(得分:2)

使用您提供的示例,使用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,} [\)])?

将匹配括号内和非括号内的字符串。 如果括号内有空格,则不匹配。

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

<强>更新 答案中没有显示一些退格。 保留字符,例如: [] {}()等必须进行转义。 修正了答案。可能错过了一两个,对不起,就此而言。