【问题标题】:Regex to find the code blocks in a C# program正则表达式在 C# 程序中查找代码块
【发布时间】:2009-03-03 10:56:35
【问题描述】:

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

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

谁能为此建议我一个正则表达式?

【问题讨论】:

    标签: c# regex


    【解决方案1】:

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

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

    【讨论】:

    • 我曾想过使用解析器。但由于几个原因,我决定仅在 C# 中实现解析。其中一个原因是我需要编写代码来解析多种语言。所以必须为所有语言编写语法。无论如何,谢谢你的建议。
    【解决方案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;
    ";
    

    【讨论】:

    • 感谢您的建议。但它不是很有用,因为代码的结构不是固定的。
    【解决方案3】:

    使用正则表达式进行平衡并不那么明显,因为您需要正确匹配最外层的For.. end loop;

    使用遍历每一行的基本循环可能会更简单,当计数器包含FOR 时增加计数器,当计数器包含end loop; 时减少计数器。 当计数器为正时,将当前行附加到结果中。
    当计数器达到 0 时,你就得到了块。

    我提出了一些建议similar recently for another SO question

    如果您只需要获取For..end loop; 之间的内部块,这很好也很容易。

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

    【讨论】:

    • 我考虑过这种编程方式。但我想如果只有一个正则表达式可以让我得到我想要的,那么它会容易得多。无论如何,谢谢你的建议。
    猜你喜欢
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2016-07-15
    • 2013-07-02
    • 1970-01-01
    相关资源
    最近更新 更多