我有一个程序,它查找源代码,查找方法,并对每个方法内部的代码执行一些计算.我正在尝试使用正则表达式来执行此操作,但这是我第一次在C#中使用它们而我在测试结果时遇到了困难.
如果我使用此正则表达式来查找方法签名:
((private)|(public)|(sealed)|(protected)|(virtual)|(internal))+([a-z]|[A-Z]|[0-9]|[\s])*([\()([a-z]|[A-Z]|[0-9]|[\s])*([\)|\{]+)
Run Code Online (Sandbox Code Playgroud)
然后通过此方法拆分源代码,将结果存储在字符串数组中:
string[] MethodSignatureCollection = regularExpression.Split(SourceAsString);
Run Code Online (Sandbox Code Playgroud)
这会得到我想要的东西,即包含其中代码的方法列表吗?
我强烈建议使用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() { }
Run Code Online (Sandbox Code Playgroud)
笔记:
Split方法会丢弃它匹配的所有东西,所以你实际上会失去你所分裂的所有"签名".{...}可以嵌套,当前的正则表达式可能会消耗更多的{比它应该using语句,属性,注释,enum定义,属性)可以显示在代码中,所以只是因为两个方法签名之间的某些东西不能使它成为方法体的一部分.| 归档时间: |
|
| 查看次数: |
3597 次 |
| 最近记录: |