当前位置:  开发笔记 > 编程语言 > 正文

使用正则表达式在源代码中查找方法

如何解决《使用正则表达式在源代码中查找方法》经验,为你挑选了1个好方法。

我有一个程序,它查找源代码,查找方法,并对每个方法内部的代码执行一些计算.我正在尝试使用正则表达式来执行此操作,但这是我第一次在C#中使用它们而我在测试结果时遇到了困难.

如果我使用此正则表达式来查找方法签名:

((private)|(public)|(sealed)|(protected)|(virtual)|(internal))+([a-z]|[A-Z]|[0-9]|[\s])*([\()([a-z]|[A-Z]|[0-9]|[\s])*([\)|\{]+)

然后通过此方法拆分源代码,将结果存储在字符串数组中:

string[] MethodSignatureCollection = regularExpression.Split(SourceAsString);

这会得到我想要的东西,即包含其中代码的方法列表吗?



1> Daniel LeChe..:

我强烈建议使用Reflection(如果合适)或CSharpCodeProvider.Parse(...)(根据rstevens的建议)

编写一个适用于所有情况的正则表达式可能非常困难.

以下是您必须处理的一些案例:

public /* comment */ void Foo(...)      // Comments can be everywhere
string foo = "public void Foo(...){}";  // Don't match signatures in strings 
private __fooClass _Foo()               // Underscores are ugly, but legal
private void @while()                   // Identifier escaping
public override void Foo(...)           // Have to recognize overrides
void Foo();                             // Defaults to private
void IDisposable.Dispose()              // Explicit implementation

public // More comments                 // Signatures can span lines
    void Foo(...)

private void                            // Attributes
   Foo([Description("Foo")] string foo) 

#if(DEBUG)                              // Don't forget the pre-processor
    private
#else
    public
#endif
    int Foo() { }

笔记:

这种Split方法会丢弃它匹配的所有东西,所以你实际上会失去你所分裂的所有"签名".

不要忘记签名中可以包含逗号

{...}可以嵌套,当前的正则表达式可能会消耗更多的{比它应该

还有许多其他东西(预处理器命令,using语句,属性,注释,enum定义,属性)可以显示在代码中,所以只是因为两个方法签名之间的某些东西不能使它成为方法体的一部分.

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有