2014-01-06 7 views
5

Ich habe die folgende Zeichenfolge:Regex zu analysieren Funktion und Parameter

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

Ich brauche einen Regex Code, um es als ein Array von Zeichenfolgen zu analysieren:

function 
param1 
param2 
param3 
param4 
. 
. 
. 
paramN 

ich mehrere Beispiele in ausprobiert habe das Netz, aber keiner von ihnen scheint für mich zu funktionieren.

[EDIT]

nicht mit dem Vorschlag woking. Überprüfen Sie den obigen Code:

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

Ausgang:

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

etwas nicht in Ordnung ist hier ... Hilfe schätzen.

Antwort

7

Je nachdem, wie komplex Ihre Funktionen werden können, kann dies tatsächlich ziemlich schwierig sein. Siehe meine ähnliche Antwort über here. Der Kern besteht darin, die Regex in zwei Probleme aufzulösen. Holen Sie sich zuerst den Funktionsnamen, dann die Parameter.

Zusammengefasst wird dies die Funktionsnamen extrahieren:

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

Für Parameter, diese Griffe Parameter sowie Funktionen in den Parametern:

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

Dies wird verschachtelte Funktionen handhaben:

Aber, wenn Sie vollständige C# -Syntax unterstützen müssen, wird dies schnell knifflig, z.B. Kommentare in den Parametern usw. Siehe here für eine Diskussion.

aktualisieren basierend auf Kommentare

Apologies, einige Fehler beim Kopieren, die ich verpasst (jetzt korrigiert). Dir fehlte das erste \ in der Funktionsregex. Sie haben auch das gleiche Muster zum Extrahieren der Parameter verwendet, während Sie die zweite Regex wie oben beschrieben benötigen. Da es nur eine Funktion pro Zeile gibt, können Sie auch nur eine einzige Übereinstimmung durchführen. Dieser Code funktioniert:

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

    } 

Ausgang:

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

Die Funktion wird nicht komplex. Params sind nur einzelne Strings. Ich benutze MVC. – Mendes

+0

@Mende, in diesem Fall wird die einfache Regex für Sie arbeiten. So wird der Regex in der Frage, die ich verknüpfte: http://stackoverflow.com/questions/18906514/regex-for-matching-functions-and-capturing-their-arguments/18908330#18908330 – acarlon

Verwandte Themen