我正在尝试使用#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
部分成为?
的可选部分但不成功,我该如何解决?
感谢。
答案 0 :(得分:1)
首先,ifdef
块必须为non-greedy,否则else
块是可选的这一事实将允许它捕获最多#endif
的所有内容。
其次,.*
默认不接受多行。您需要启用single-line option。
此模式适用于您的输入:
\#ifdef\s+(\S*)[^\n]*
(.*?)
(?:\s*\#else[^\n]*
(.*)
)?\s*\#endif