C# 用正则表达式解析C中的ifdef

C# 用正则表达式解析C中的ifdef,c#,regex,conditional-compilation,C#,Regex,Conditional Compilation,我试图用Regex解析H文件中的#ifdefdeclrations 输入示例: #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]* ([^(.*)]*) \#e

我试图用
Regex
解析H文件中的
#ifdef
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中的代码

我正试图使
#else
部分与
一起成为可选的?
但没有成功,我如何修复它


谢谢。

首先,需要设置
ifdef
块,否则
else
块是可选的,这将允许它捕获到
#endif
之前的所有内容

其次,
*
默认情况下不接受多行。您需要启用

此模式适用于您的输入:

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

旁注:这种方法不适用于嵌套的#ifdef语句:)remark2:是否有理由在#else和#endif之后省略匹配?此外,您的表达式包括“?”不是(\\ endif)吗?工作?您还必须在
中声明
\else
,例如类似
(\\35; else([(.*))?
。不过,如果您想从中获取任何有意义的数据,您可能需要使用命名捕获。备注3:The
[^(.*)]
应该做什么?我很惊讶它可能在做你不想做的事情:)嗨,@Luaan我试过这句话,它没有像我预期的那样工作,
[^(.*)]
假设在
\if
\else
之间解析代码