我有一个程序,它查找源代码,查找方法,并对每个方法内部的代码执行一些计算.我正在尝试使用正则表达式来执行此操作,但这是我第一次在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);
这会得到我想要的东西,即包含其中代码的方法列表吗?
我强烈建议使用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
定义,属性)可以显示在代码中,所以只是因为两个方法签名之间的某些东西不能使它成为方法体的一部分.