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

我正在编写一个影响分析工具,它将解析一堆选定的文件类型,并在文件中找到类和方法调用(在本例中为.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*)+\)"); 

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

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

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

 (?[a-zA-Z]+) 

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

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

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

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

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

可以通过添加组来修改模式以捕获方法名称。 这是完整的代码:

 string method_pattern = @"\b(public|private|internal|protected)\s*" + @"\b(static|virtual|abstract)?\s*[a-zA-Z]*(?\s[a-zA-Z]+\s*)" + @"\((([a-zA-Z\[\]\<\>]*\s*[a-zA-Z]*\s*)[,]?\s*)+\)"; while ((line = file.ReadLine()) != null) { Regex expression = new Regex(method_pattern); Match match = expression.Match(line); if (match.Success) { string result = match.Groups["method"].Value; MessageBox.Show(result); } }