【问题标题】:Using regex to filter for preprocessor directives?使用正则表达式过滤预处理器指令?
【发布时间】:2017-02-09 14:28:57
【问题描述】:

我必须从大量的 cpp 文件中过滤掉所有定义的宏,不包括守卫,例如:

#if <NAME>
#ifdef <NAME>
#ifndef <NAME>
#if defined(<NAME>)
#if defined <NAME>
!defined(<NAME>)
!defined <NAME>
#else if <NAME>
#elif <NAME>

我必须检索所有的NAME,但它们并不都是 XXX 的形式,由于不同的程序员在项目上工作,有很多定义,所以我面临着问题定义一个正则表达式,它只能从刚刚描述的每种情况中推断出&lt;NAME&gt;

感谢任何建议!

编辑 正如有人指出的那样,我的 NAME(带环绕 XXXX、XXXX、_XX_Y_、_XXX、_XXX_Y、XXYY,其中 X 和 Y 可以是大写字母或数字,名字没有规律!它们是预处理器的指令,我必须将它们过滤掉

【问题讨论】:

  • 这是grepawk 的工作,具体取决于您需要对找到的行做什么。

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


【解决方案1】:

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

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

更新 05.03.2020 @gregn3 在 cmets 中提供了一个更新版本,它允许在 # 和以下单词之间使用空格。

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

【讨论】:

  • 这里有更多preprocessor directives syntax的例子。在#define 之间可以有空格和制表符,但没有别的。这是您的正则表达式的更新版本:([#!][ \t]*[A-z]{2,}[\s]{1,}?([A-z]{2,}[\s]{1,}?)?)([\\(]?[^\s\\)]{1,}[\\)]?)?(在初始 [#!] 之后添加 [ \t]*
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 2011-09-14
  • 2017-07-18
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多