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

Posted

技术标签:

【中文标题】用于查找 C# 类和方法名称的正则表达式【英文标题】:Regular Expressions to find C# class and method names 【发布时间】:2011-11-27 10:23:21 【问题描述】:

我正在编写一个影响分析工具,它将解析一堆选定的文件类型,并在文件中找到类和方法调用(在本例中为 .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# 文件解析器能够为我提供文件中的方法名和类名列表?

【问题讨论】:

***.com/questions/906493/… [a-zA-Z] 不会将其用于 C# 方法名称。例如。 "private void µäか() " 是一个有效的 C# 方法声明。 感谢 Jens,此工具仅在我公司内部不用于外部商业用途,我们只用英文编写代码,因此它适用于“我们”,但感谢您指出这一点,这是一个非常有效点。 【参考方案1】:

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

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

然后你可以这样访问它:

Match match = regex.Match(line);
if (match.Success)

    string method = match.Groups["method"].Value;

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

它不处理泛型(泛型方法、参数或返回值) 它不处理带有数字或 _ in 的标识符 它不处理带有默认访问修饰符的方法 它将匹配包含看起来像方法声明的内容的字符串文字

要从 C# 文件中获取方法名称,您确实需要了解 C# 的内容。请注意,Roslyn 项目很可能会使这类事情变得更容易 - 我们会看到第一个预览版何时发布,现在很快......

【讨论】:

感谢您的帮助,我已根据您的输入修改了正则表达式 private const string IsMethodRegex = @"\b(public|private|internal|protected)?\s*(static|virtual|摘要)?\s*([a-zA-Z\_1-9]*)\s(?[a-zA-Z\_1-9]+)\s*( ((([a-zA-Z[]\_1-9]*\s*[a-zA-Z_1-9]*\s*)[,]?\s*)+))"; 【参考方案2】:

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

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);
    

【讨论】:

【参考方案3】:

这是匹配 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
    


【讨论】:

以上是关于用于查找 C# 类和方法名称的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

C#中的正则匹配和文本处理

使用正则表达式从 C# 中的 SQL 语句中查找 SQL 函数

C# 正则表达式类 Match类和Group类

C#正则表达式编程:Match类和Group类用法

类和正则式

正则表达式在 C# 源文件中查找注释