首页 文章

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

提问于
浏览
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 \ n . 他们将被过滤 .

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

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

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

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

1 回答

  • 3

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

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

    我会使子表达式4成为一个非捕获组,我根本不打扰对子表达式6进行分组,因为两者的内容都可以通过上下文推断出来 .

相关问题