我尝试在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以及应该(不)定义的键+第二场比赛中的其他所有内容。
是否有正则表达式的解决方案?正则表达式是这种事情的最佳解决方案吗?
答案 0 :(得分:3)
由于子表达式4和5是可选的,即使输入中出现#else
,贪婪的第二和第三子表达式最终会吞噬所有内容。你需要让他们不贪心。为了确保仅在子表达式4匹配时填充子表达式5,将一个放在另一个内。你最终会得到这个:
/#(ifn?def) +(.*?)\n(.*?)(#else(.*))?(#endif)/si
我会将子表达式4作为非捕获组,我根本不打扰对子表达式6进行分组,因为两者的内容都可以由上下文推断。