Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式在C#程序中查找代码块_C#_Regex - Fatal编程技术网

正则表达式在C#程序中查找代码块

正则表达式在C#程序中查找代码块,c#,regex,C#,Regex,我必须使用C#中的正则表达式从给定代码中查找代码块 e、 我必须从下面的代码中找到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;

我必须使用C#中的正则表达式从给定代码中查找代码块

e、 我必须从下面的代码中找到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;


有人能给我推荐一个正则表达式吗?

我认为这是不可能的。您要求使用正则表达式解析上下文无关语言,虽然Perl-REs实际上可以解析CFL,但我不确定C#正则表达式是否可以做到,使用它并不是最大的乐趣


解决问题的自然方法是为该语言创建一个解析器,并从中获取信息。您可以使用像CoCo/R或ANTLR这样的解析器生成器。

我认为这是不可能的。您要求使用正则表达式解析上下文无关语言,虽然Perl-REs实际上可以解析CFL,但我不确定C#正则表达式是否可以做到,使用它并不是最大的乐趣


解决问题的自然方法是为该语言创建一个解析器,并从中获取信息。您可以使用诸如CoCo/R或ANTLR之类的解析器生成器。

使用正则表达式进行平衡并不那么明显,因为您需要正确匹配最外层的
。。端环

使用一个基本循环遍历每一行可能更简单,当它包含
FOR
时增加计数器,当它包含
结束循环时减少计数器。
计数器为正时,将当前行附加到结果中。
当计数器达到0时,您就有了阻塞

我提出了一些建议

如果您只需要获得For..end循环的
For之间的内部块,那么这是非常简单的


正如jpalecek所说,如果您需要做更多的工作,最好使用更合适的解析方法,否则您的工作将变得越来越困难。

使用正则表达式进行平衡并不那么明显,因为您需要正确匹配最外层的
。。端环

使用一个基本循环遍历每一行可能更简单,当它包含
FOR
时增加计数器,当它包含
结束循环时减少计数器。
计数器为正时,将当前行附加到结果中。
当计数器达到0时,您就有了阻塞

我提出了一些建议

如果您只需要获得For..end循环的
For之间的内部块,那么这是非常简单的


正如jpalecek所说,如果您需要做更多的工作,最好使用更合适的解析方法,否则您的工作将变得越来越困难。

好吧,使用.net正则表达式可以做到这一点,如果您真的不需要真正的解析器,您可以使用此解决方案。在中对其进行了很好的解释,我可以向您确认它工作良好(我使用它实现了一个简单的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;
";
字符串模式=@”
(?#第01行)用于。。。
(?#第02行)(?>
(?#第03行)用于……(?)
(?#第04行)|
(?#第05行)末端回路;(?)
(?#第06行)|
(?#第07行)。?
(?#第08行))*
(?#第09行)(?(深度)(?!)
(?#第10行)端环;
";

好吧,使用.net正则表达式可以做到这一点,如果您真的不需要真正的解析器,可以使用此解决方案。在中对其进行了很好的解释,我可以向您确认它工作良好(我使用它实现了一个简单的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;
";
字符串模式=@”
(?#第01行)用于。。。
(?#第02行)(?>
(?#第03行)用于……(?)
(?#第04行)|
(?#第05行)末端回路;(?)
(?#第06行)|
(?#第07行)。?
(?#第08行))*
(?#第09行)(?(深度)(?!)
(?#第10行)端环;
";

我考虑过这种编程。但我想,如果只有一个正则表达式可以让我得到我想要的,那就容易多了。无论如何,谢谢你的建议。我已经考虑过这种编程。但我想,如果只有一个正则表达式可以让我得到我想要的,那就容易多了。不管怎样,谢谢你的建议。但是它不是很有用,因为代码的结构不是固定的。谢谢你的建议。但它不是很有用,因为代码的结构不是固定的。但由于一些原因,我决定只用C语言实现解析。其中一个原因是我需要编写代码来解析多种语言,所以我必须为所有语言编写语法。无论如何,谢谢你的建议。我曾想过使用解析器。但由于一些原因,我决定只用C语言实现解析。其中一个原因是我需要编写代码来解析多种语言,所以我必须为所有语言编写语法。无论如何,谢谢你的建议。