正则表达式在C#中找到代码块

时间:2009-03-03 10:56:35

标签: c# regex

我必须在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;

有人可以建议我使用任何正则表达式吗?

感谢。

3 个答案:

答案 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所说,如果你需要做更多,最好使用更合适的解析方法,否则你的工作将变得越来越困难。