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

时间:2013-09-23 23:22:47

标签: regex delphi pcre preprocessor-directive

我尝试在Delphi中使用regex来解决C PreProcessor指令。作为一个例子,我有一些包含

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

#else

bar
#endif

我想要的是在我的拳头比赛中知道,如果是ifdef或ifndef 在我的第二场比赛中,我想得到,应该(不)定义什么 排名第三的是#else或#endif之前的所有内容 如果是#else,#else应该是匹配4的内容。
然后匹配5将再次满足并且匹配6将仅保持#endif
BTW。我不关心比赛中的\ n或\ r \ n。它们将被过滤。

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

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

这绝对不起作用。无论我尝试什么,我都只能获得#ifdef以及应该(不)定义的键+第二场比赛中的其他所有内容。

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

1 个答案:

答案 0 :(得分:3)

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

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

我会将子表达式4作为非捕获组,我根本不打扰对子表达式6进行分组,因为两者的内容都可以由上下文推断。