用于解析函数和参数的正则表达式

8

我有以下字符串:

function(param1, param2, param3, param4, ..., paramN)

我需要一个正则表达式代码,将其解析为字符串数组:
function
param1
param2
param3
param4
.
.
.
paramN

我在网上尝试了几个例子,但似乎都对我无效。

[编辑]

按照建议进行操作仍然无法正常工作。请检查上述代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;

namespace TestRegex
{
    class Program
    {
        static void Main(string[] args)
        {
            string Expression = String.Empty;

            while (Expression.Trim() != "EXIT")
            {
                Expression = Console.ReadLine();

                ///
                /// Get function name
                /// 
                var funcTags = Regex.Matches(Expression, @"b[^()]+\((.*)\)$");

                Console.WriteLine("Matches: " + funcTags.Count);
                foreach (var item in funcTags)
                    Console.WriteLine("FuncTag: " + item);

                ///
                /// Get parameters
                /// 
                var paramTags = Regex.Matches(Expression, @"\b[^()]+\((.*)\)$");

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

输出:

function("a", "b", "c");
Matches: 0
Matches: 0

这里似乎有问题......感谢帮助。

1个回答

10

根据您的函数有多复杂,这可能会非常棘手。请参阅我在这里的类似答案。要点是将正则表达式分解为两个问题。首先获取函数名称,然后获取参数。

总之,这将提取函数名称:

\b[^()]+\((.*)\)$

对于参数而言,这个处理方式同样适用于函数作为参数的情况:

([^,]+\(.+?\))|([^,]+)

这将处理嵌套函数:

(?:[^,()]+((?:\((?>[^()]+|\((?<open>)|\)(?<-open>))*(?(open)(?!))\)))*)+

但是,如果您需要支持完整的C#语法,这将变得非常棘手,例如在参数中添加注释等。请参见此处进行讨论。

基于评论的更新

抱歉,我错过了一些复制错误(已经更正)。您漏掉了函数正则表达式中的第一个 \。您还使用了相同的模式来提取参数,而实际上您需要使用上面描述的第二个正则表达式。另外,由于每行只有一个函数,所以只需执行单次匹配即可。下面的代码可以工作:

    static void Main( string[] args )
    {
        string Expression = "function(param1, param2)";            
        ///
        /// 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 );

    }

输出:

FuncTag: function(param1, param2)
Matches: 2
ParamTag: param1
ParamTag:  param2

该函数不会变得复杂。参数只包含单个字符串。我正在使用MVC。 - Mendes
@Mendex,如果是这样的话,简单的正则表达式对你也适用。我在链接的问题中提到的正则表达式也可以使用:https://dev59.com/zWMk5IYBdhLWcg3w3xdY#18908330 - acarlon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接