CPP 指令 #ifdef 正则表达式解决方案

Posted

技术标签:

【中文标题】CPP 指令 #ifdef 正则表达式解决方案【英文标题】:CPP Directive #ifdef Regex Solution 【发布时间】:2013-09-29 00:19:08 【问题描述】:

我尝试在 Delphi 中使用正则表达式来解决 C PreProcessor 指令。例如,我有一些包含

的文本文件
#define test
#ifdef test
foo

#else

bar
#endif

我想在我的第一场比赛中知道是 ifdef 还是 ifndef。 在我的第二场比赛中,我想知道应该(不)定义什么。 在#else 或#endif 之前,第三个将是一切。 如果是#else,#else应该是第4场比赛的内容。 然后匹配 5 将再次成为内容,匹配 6 将仅包含 #endif 顺便提一句。我不在乎比赛中的 \n 或 \r 。它们将被过滤掉。

我的第一次尝试是以下正则表达式:

/#(ifn?def) +(.*)\n(.*)(#else)?(.*)?(#endif)/si

这绝对行不通。而且无论我尝试什么,我都只能在第二场比赛中获得#ifdef 和应该(不)定义的键+其他所有内容。

有正则表达式的解决方案吗?正则表达式是这种事情的最佳解决方案吗?

【问题讨论】:

正则表达式几乎肯定不是解决问题的最佳方法。例如,您将如何处理嵌套?如果你想要一个解析器,就写一个解析器。 @Carl Norum:事实上,我知道不会有嵌套——至少现在是这样。好吧。我希望有一个简单的正则表达式解决方案。如果没有,我将不得不编写一个解析器。 【参考方案1】:

由于子表达式 4 和 5 是可选的,贪婪的第二个和第三个子表达式最终会吞噬一切,即使 #else 出现在您的输入中。你需要让他们不贪婪。为确保仅在子表达式 4 匹配时才填充子表达式 5,请将一个放在另一个里面。你最终会得到这个:

/#(ifn?def) +(.*?)\n(.*?)(#else(.*))?(#endif)/si

我会将子表达式 4 设为 非捕获 组,并且我根本不会费心将子表达式 6 分组,因为两者的内容都可以通过上下文推断出来。

【讨论】:

以上是关于CPP 指令 #ifdef 正则表达式解决方案的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp CPP - 教程019 - C ++正则表达式

c_cpp 正则表达式的数据生成器

通配符正则表达式的记录

正则表达式测试作为属性的指令实现错误 - 验证(打字稿+角度)

正则表达式

正则表达式删去双引号vscode