C预处理器指令中#else情况的正则表达式

时间:2017-03-15 09:46:42

标签: regex c-preprocessor

我想找到某个C预处理器定义的#else个案。

示例:

#if defined(my_define)
  // multiple 
  // lines 
  // of 
  // code
#else
  // multiple 
  // lines 
  // of 
  // code
#endif

#if defined (my_define)
  // same as above from here 

但我不想匹配没有#else的案例:

#if defined(my_define)
  // multiple 
  // lines 
  // of 
  // code
#endif

我不关心嵌套的#if,只是上面的情况。

我尝试从

开始
defined..?my_define.(\r\n|\r|\n)?

我不知道如何处理指令之间的任意行数。

1 个答案:

答案 0 :(得分:1)

你可以在这里使用一个驯化的贪婪令牌解决方案:

#if defined..?my_define\b(?:(?!#(?:end)?if)[\s\S])*#else(?:(?!#(?:end)?if)[\s\S])*#endif

请参阅regex demo

<强>详情:

  • #if defined - 一个litla char序列
  • ..? - 除了换行符之外的任何1或2个字符
  • my_define\b - 整个字my_define
  • (?:(?!#(?:end)?if)[\s\S])* - 匹配任何不是#endif#if文字字符序列起点的字符的驯化贪婪令牌
  • #else - 文字字符序列
  • (?:(?!#(?:end)?if)[\s\S])* - 与上述相同
  • #endif - 文字字符序列