gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:21:26 25 4
gpt4 key购买 nike

我有一个程序可以查看源代码、定位方法并对每个方法内部的代码执行一些计算。我正在尝试使用正则表达式来执行此操作,但这是我第一次在 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 定义、属性)可以出现在代码中,所以仅仅因为两个方法签名之间的内容不会使其成为方法主体的一部分。

关于c# - 使用正则表达式在源代码中查找方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/726777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com