2

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

#define test
#ifdef test
foo

#else

bar
#endif

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

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

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

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

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

4

1 回答 1

3

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

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

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

于 2013-09-24T02:53:10.870 回答