使用正则表达式过滤预处理器指令?
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>
。
如有任何建议,我们将不胜感激!
编辑
正如有人指出的那样,我的 NAME (带有 surrondings < )只是一个占位符,实际上它可以是 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,}[\)]?)?
快速解释:
([#!][A-z]{2,}[\s]{1,}?([A-z]{2,}[\s]{1,}?)?)
匹配(大多数)以“#”或“!”开头的字符串和指令。
也允许使用第二个单词,忽略空格(它将匹配有无 n 空格)
([\(]?[^\s\)]{1,}[\)]?)?
将匹配括号中的字符串和 none-bracketed 字符串。
如果括号内有空格,则不会匹配。
如果要匹配括号内的空格,更改^\s\)
至 ^\)
更新
一些退格键没有显示在答案中。
保留字符例如:[]{}() 等必须转义。
修复了答案。可能漏掉了一两个,抱歉。
更新 05.03.2020
@gregn3 在评论中提供了一个更新版本,它允许 #
和后面的词之间有空格。
([#!][ \t]*[A-z]{2,}[\s]{1,}?([A-z]{2,}[\s]{1,}?)?)([\(]?[^\s\)]{1,}[\)]?)?
我必须从大量的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 < )只是一个占位符,实际上它可以是 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,}[\)]?)?
快速解释:
([#!][A-z]{2,}[\s]{1,}?([A-z]{2,}[\s]{1,}?)?)
匹配(大多数)以“#”或“!”开头的字符串和指令。 也允许使用第二个单词,忽略空格(它将匹配有无 n 空格)
([\(]?[^\s\)]{1,}[\)]?)?
将匹配括号中的字符串和 none-bracketed 字符串。 如果括号内有空格,则不会匹配。
如果要匹配括号内的空格,更改^\s\) 至 ^\)
更新 一些退格键没有显示在答案中。 保留字符例如:[]{}() 等必须转义。 修复了答案。可能漏掉了一两个,抱歉。
更新 05.03.2020
@gregn3 在评论中提供了一个更新版本,它允许 #
和后面的词之间有空格。
([#!][ \t]*[A-z]{2,}[\s]{1,}?([A-z]{2,}[\s]{1,}?)?)([\(]?[^\s\)]{1,}[\)]?)?