使用Regex解析C#中的#ifdef

时间:2014-02-10 12:14:59

标签: c# regex conditional-compilation

我正在尝试使用#ifdef解析H文件中的Regex个declrations。

输入示例:

#ifdef D_MAIN /* CMNTS */
  #define EXT_D
  some code
#else /* CMNTS */
  #define EXT_D extern 
  some code
#endif /* CMNTS */

到目前为止,我有这样的表达:

\#ifdef\s+(\S*)[^\n]*
([^(.*)]*)
\#else\s+(\S*)[^\n]*
([^(.*)]*)
\#endif

我想得到一个定义列表,每个def应该采用:def name(D_MAIN),#ifdef语句中的代码和#else stmnt中的代码。< / p>

我正在努力使#else部分成为?的可选部分但不成功,我该如何解决?

感谢。

1 个答案:

答案 0 :(得分:1)

首先,ifdef块必须为non-greedy,否则else块是可选的这一事实将允许它捕获最多#endif的所有内容。

其次,.*默认不接受多行。您需要启用single-line option

此模式适用于您的输入:

\#ifdef\s+(\S*)[^\n]*
(.*?)
(?:\s*\#else[^\n]*
(.*)
)?\s*\#endif