正则表达式,用于查找C#类和方法名称

Jos*_*shy 3 c# regex parsing

我正在编写一个影响分析工具,它将解析一堆选定的文件类型,并在文件中找到类和方法调用(在本例中为.cs文件).我设法编写了一个正则表达式,可以找到一行代码是否为方法调用.

Regex re = new Regex(
               @"\b(public|private|internal|protected)\s*" +
                "(static|virtual|abstract)?\s*[a-zA-Z]*\s[a-zA-Z]+\s*" +
                "\((([a-zA-Z\[\]\<\>]*\s*[a-zA-Z]*\s*)[,]?\s*)+\)");
Run Code Online (Sandbox Code Playgroud)

然而; 我无法弄清楚如何从正则表达式中获取方法名称.它将一行识别为匹配,但如何提取实际方法名称.对此的任何帮助都会很棒.

此外; 我不确定这是不是它实际上是如何完成的,但还有其他(最新的)c#文件解析器能够从文件中提供方法名称和类名列表吗?

Jon*_*eet 5

您可以将表示方法的部分放入如下所示的组中:

(?<method>[a-zA-Z]+)
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样访问它:

Match match = regex.Match(line);
if (match.Success)
{
    string method = match.Groups["method"].Value;
}
Run Code Online (Sandbox Code Playgroud)

但是,您的正则表达式在匹配方法名称方面存在各种问题:

  • 它不处理泛型(泛型方法,参数或返回值)
  • 它不处理带有数字或_的标识符
  • 它不处理具有默认访问修饰符的方法
  • 它将匹配包含类似于方法声明的字符串文字

要从C#文件中获取方法名称,您确实需要能够理解C#的东西.请注意,Roslyn项目可能会使这类事情变得更加容易 - 我们会在第一次预览出来时看到,很快就会出现......