【问题标题】:Regex to parse function and parameters正则表达式解析函数和参数
【发布时间】:2014-01-06 23:30:00
【问题描述】:

我有以下字符串:

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

这里出了点问题...感谢帮助。

【问题讨论】:

    标签: c# regex asp.net-mvc


    【解决方案1】:

    根据您的函数的复杂程度,这实际上可能非常棘手。请参阅我对 here 的类似回答。要点是将正则表达式分解为两个问题。先获取函数名,再获取参数。

    总之,这将提取函数名:

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

    对于参数,这处理参数以及参数中的函数:

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

    这将处理嵌套函数:

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

    但是,如果您需要支持完整的 C# 语法,这会很快变得棘手,例如cmets 参数等。请参阅here 进行讨论。

    基于 cmets 的更新

    抱歉,我错过了一些复制错误(现已更正)。您缺少函数正则表达式中的第一个 \ 。您还使用相同的模式来提取参数,而您需要如上所述的第二个正则表达式。此外,由于每行只有一个函数,因此您可以只进行一次匹配。此代码将起作用:

        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。
    • @Mendex,在这种情况下,简单的正则表达式将为您工作。我链接的问题中的正则表达式也是如此:stackoverflow.com/questions/18906514/…
    猜你喜欢
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    相关资源
    最近更新 更多