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
之间解析代码