正则表达式简化 - 组太多了

我正在为C-Style预处理器编写一个简单的文本抓取器。输入文本(示例):
#if 1 > 0
blah
#if defined MACRO1
blah blah blah
#if !defined MACRO2
blaaaah
#if      !   defined MACRO3
blah?
我想捕获每个
#if [!] defined
语句后面的文本。我需要从上面的文本输出:
MACRO1
MACRO2
MACRO3
此处需要捕获的行号是3,5和7.请注意,第7行有空格与制表符混合。 我试图创建表达式,可以给我这个结果,但没有一个如此辉煌。我得到所需结果的表达是 -
(?<=(?<=(?<=(?<=(?<=(?<=#if)[st]+)!?)[st]*)defined)[st]+).*
使用的选项有:Multiline + IgnoreCase 但我确信这不优雅,简洁。 有人可以建议更好的表达吗? PS - 我正在使用Expresso来测试表达式。     
已邀请:
这应该工作     鉴于s包含你的问题中的输入与换行符等
foreach(var match in Regex.Matches(s, @"(?<=#ifs*!?s*defineds*)(?<macro_name>w+)")) {
  Console.WriteLine(match);
}
将发现MACRO01,MACRO02和MACRO03为3次捕获     
那个正则表达式怎么样?
#if[st]+[!]?[st]*defined[st]*(.*)
在后向引用中,你得到MACRO1 / MACRO2 / MACRO3。     
Ay Nayan 我知道您需要获取所有“#if defined”和“#if!defined”预处理器指令的宏引用名称,这些指令位于通用c源代码文本流中... 我可以建议你那个简单的正则表达式
^#ifs*!?s*defineds*(w*).*$
之前的正则表达式只有一个定义的捕获组( w *),以便只获取宏名称。 捕获组将填充所有宏名称出现。 * PS:必须使用多行+忽略大小写选项执行正则表达式。我使用RegExr工具测试了那个http://gskinner.com/blog/archives/2008/03/regexr_free_onl.html*     
这有用吗
^#if(?:[ t]*!)?[ t]*defined[ t]*(.*?)$
没有多线选项?     

要回复问题请先登录注册