开发者

Regular Expressions to find C# class and method names

I'm writing an impact analysis tool that will parse a bunch of selected file types and find the class and method calls inside the file (in this case a .cs file). I have managed to write a regular expression that will find if a line of code is a method call.

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

However; I can't figure out how to get the Method name out of the regular expression. It recognises a line as a Match but how do开发者_如何转开发 i pull out the actual method name. Any help on this would be amazing.

Furthermore; I'm not sure if this is how it's actually done but is there any other (up to date) c# file parsers that will be able to provide me a list of method names and class names from the file?


You can put the part that represents a method into a group like this:

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

Then you can access it like this:

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

However, your regex at the moment has various problems in terms of matching method names:

  • It doesn't handle generics (generic methods, parameters or return values)
  • It doesn't handle identifiers with digits or _ in
  • It doesn't handle methods with the default access modifier
  • It will match string literals containing something looking like a method declaration

To get method names out of a C# file, you really need something which understands C#. Note that the Roslyn project may well make this sort of thing a lot easier - we'll see when the first preview comes out, very soon now...


Your pattern can be modified to capture method name by adding a group. Here's the complete code:

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


Here's how you can match method names of a C# class.

Regex Expression:

\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*)+\)

Usage:

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
    }
}

Regular Expressions to find C# class and method names

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜