我必须在C#中使用Regex从给定代码中找到代码块。
e.g。我必须从以下代码中找到For循环块
For A in 1..10
Loop
stmt1;
For C in cur_op
Loop
stmt2;
end loop;
end loop;
For T in 4..8
loop
stmt3;
end loop;
我想将代码块检索为
For A in 1..10
Loop
stmt1;
For C in cur_op
Loop
stmt2;
end loop;
end loop;
和
For T in 4..8
loop
stmt3;
end loop;
有人可以建议我使用任何正则表达式吗?
感谢。
答案 0 :(得分:3)
我不认为这是可能的。你要求正则表达式解析一个无上下文的语言,虽然Perl REs实际上可以解析CFL,但我不确定C#正则表达式是否可以做到这一点,并且使用它并不是最大的乐趣。
您的问题的自然解决方案是为该语言创建解析器,并从中获取信息。您可以使用CoCo / R或ANTLR等解析器生成器。
答案 1 :(得分:2)
嗯,用.net Regex可以做到这一点,如果你真的不需要真正的解析器,你可以选择这个解决方案。在this article on codeproject.com中很好地解释了它,我可以确认它运行良好(我用它来实现一个简单的bbcode解析器)。
你的模式可能看起来像这样:
String pattern = @"
(?# line 01) For ... in ...
(?# line 02) (?>
(?# line 03) For ... in ... (?<DEPTH>)
(?# line 04) |
(?# line 05) end loop; (?<-DEPTH>)
(?# line 06) |
(?# line 07) .?
(?# line 08) )*
(?# line 09) (?(DEPTH)(?!))
(?# line 10) end loop;
";
答案 2 :(得分:0)
使用正则表达式进行平衡并不是那么明显,因为您需要正确匹配最外层的For.. end loop;
。
通过每一行的基本循环可能更简单,当计数器包含FOR
时递增计数器,并在包含end loop;
时递减计数器。
当计数器为正数时,您将当前行追加到结果中
当计数器达到0时,你已经得到了阻止。
我提出了一些similar recently for another SO question。
如果只需要在For..end loop;
之间获取内部块,那么这很简单。
正如jpalecek所说,如果你需要做更多,最好使用更合适的解析方法,否则你的工作将变得越来越困难。