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

时间:2011-09-29 06:05:04

标签: 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*)+\)");

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

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

3 个答案:

答案 0 :(得分:5)

您可以将代表方法的部分放入group,如下所示:

(?<method>[a-zA-Z]+)

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

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

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

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

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

答案 1 :(得分:0)

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

string method_pattern = @"\b(public|private|internal|protected)\s*" + @"\b(static|virtual|abstract)?\s*[a-zA-Z]*(?<method>\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);
    }
}

答案 2 :(得分:0)

在这里,您可以匹配C#类的方法名称。

正则表达式:

\b(public|private|internal|protected|void)\s*s*\b(async)?\s*\b(static|virtual|abstract|void)?\s*\b(async)?\b(Task)?\s*[a-zA-Z]*(?<method>\s[A-Za-z_][A-Za-z_0-9]*\s*)\((([a-zA-Z\[\]\<\>]*\s*[A-Za-z_][A-Za-z_0-9]*\s*)[,]?\s*)+\)

用法:

private void FindMethods(string input)
{
    try
    {
        const string methodPattern =
            @"\b(public|private|internal|protected|void)\s*s*\b(async)?\s*\b(static|virtual|abstract|void)?\s*\b(async)?\b(Task)?\s*[a-zA-Z]*(?<method>\s[A-Za-z_][A-Za-z_0-9]*\s*)\((([a-zA-Z\[\]\<\>]*\s*[A-Za-z_][A-Za-z_0-9]*\s*)[,]?\s*)+\)";
        foreach (Match m in Regex.Matches(input, methodPattern, RegexOptions.IgnorePatternWhitespace))
        {
            Console.WriteLine(m.Value);
            Console.WriteLine(m.Groups["method"].Value);
        }
    }
    catch (ArgumentException ex)
    {
        // Syntax error in the regular expression
    }
}

proof