如何使用Regex匹配函数和捕获它们的参数

时间:2014-07-24 14:36:35

标签: c# regex

我有一个由多个函数组成的文件:

public int function(param1, param2, param3, param4,paramN)
{
}

public void function1(param1, param2)
{
}

public void function2()
{
}

我已经使用此代码来获取函数名称和参数:

class Program
{


    static void Main(string[] args)
    {

        // Read the file as one string.
        System.IO.StreamReader myFile =
           new System.IO.StreamReader("E:\\new1.c");
        string myString = myFile.ReadToEnd();
        string Expression = myString;
        ///
        /// Get function name
        /// 
        var func = Regex.Match(Expression, @"\b[^()]+\((.*)\)$");

        Console.WriteLine("FuncTag: " + func.Value);
        string innerArgs = func.Groups[1].Value;
        ///
        /// Get parameters
        /// 
        var paramTags = Regex.Matches(innerArgs, @"([^,]+\(.+?\))|([^,]+)");

        Console.WriteLine("Matches: " + paramTags.Count);
        foreach (var item in paramTags)
            Console.WriteLine("ParamTag: " + item);
        myFile.Close();

        // Display the file contents.
        Console.WriteLine(myString);
        // Suspend the screen.
        Console.ReadLine();
        Console.ReadKey();

    }
}

当我放string Expression ="function(param1, param2, param3, param4,paramN)"时这很好用,但当我把文件的名称改为无效时。我想从文件中读取所有函数并用参数显示所有函数。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

不是为特定编程语言(如UltraEdit或Notepad ++)编写的文本编辑器也使用正则表达式来查找函数/方法,函数参数等的名称。

因此,也可以在C#编码的应用程序中使用这些文本编辑器的正则表达式。


<强>注意!

识别符号名称的正则表达式方法永远不会完美,可能会返回误报或不正确的数据。

例如,在注释中使用包含){等特殊字符的函数定义的括号内的块或行注释将始终产生错误的结果。当然,正如C / C ++ / C#编译器所做的那样,正则表达式搜索不会消除函数定义中的块和行注释。


UltraEdit v21.20在语法高亮显示wordfile c_cplusplus.uew中使用Perl正则表达式字符串

^(?!if\b|else\b|while\b|[\s*])(?:[\w*~_&]+?\s+){1,6}([\w:*~_&]+\s*)\([^);]*\)[^{;]*?(?:^[^\r\n{]*;?[\s]+){0,10}\{

此表达式中只有1个标记组,它(通常)与函数/方法的名称相匹配。

上面的表达式在C / C ++文件中匹配从函数定义行开始到开始大括号的所有内容,同样限制了不适用于C / C ++源文件中可能的所有函数定义格式。

UltraEdit在\(\)的整个找到的字符串中搜索,并使用表达式\s*([^,]+)提取此字符串以进一步处理函数参数。

因此可以使用

^(?!if\b|else\b|while\b|[\s*])(?:[\w*~_&]+?\s+){1,6}([\w:*~_&]+\s*)\(([^);]*)\)[^{;]*?(?:^[^\r\n{]*;?[\s]+){0,10}\{

现在包含2个标记组:

  • 第一个匹配函数/方法的名称。
  • 第二个匹配括号之间的所有内容。

因此,\s*([^,]+)可以接下来搜索每个第二个匹配,以获取带有类型(和注释)的函数参数,并且在所有找到的字符串上,应使用String.TrimEnd方法删除所有尾随空格和制表符