2014-02-10 48 views
0

我想解析#ifdef在H文件Regex declrations。解析#ifdef在C#與正則表達式

輸入例:

#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名(D_MAIN)時, #ifdef聲明中的代碼和#else stmnt中的代碼。

我試圖使#else部分爲?可選,但沒有成功,我該如何解決它?

謝謝。

+1

側注:此方法不會使用嵌套#ifdef語句工作:) – Olivier

+1

備註2:有沒有對的#else和#endif後省略\ n匹配一個原因嗎?此外,你的表達包括「?」 isnt(\ #endif)?工作? – Olivier

+0

你也必須在''中有'#else'聲明,例如。像'(\ #else([(。*)] *))?'。不過,如果你想從中獲取任何有意義的數據,你可能想要使用命名捕獲。 – Luaan

回答

1

首先,ifdef塊需要是non-greedy,否則else塊是可選的事實將允許它捕獲高達#endif的所有內容。

其次,.*默認情況下不會接受多行。您需要啓用single-line option

這種模式與您的輸入:

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