2014-01-06 12 views
5

I次の文字列があります:私はいくつかの例を試してみた正規表現は、機能を解析し、パラメータに

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 

何かがここで間違っている...助けに感謝。

答えて

7

機能の複雑さによっては、実際には非常に難しい場合があります。私の似たような答えはhere以上です。要点は、正規表現を2つの問題に分解することです。最初に関数名を取得し、次にパラメータを取得します。

パラメータの場合
\b[^()]+\((.*)\)$ 

は、このパラメータにパラメータなどの機能を処理します:

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

これは、処理するネストされた関数:

要約すると、これは、関数名を抽出します

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

しかし、完全なC#構文をサポートする必要がある場合、これは手間がかかりますが、例えば、パラメータ内のコメントなど。hereを参照してください。コメント

謝罪、私は逃したコピーに多少の誤差に基づいて

更新(現在は修正)。あなたは関数正規表現の最初の\を忘れていました。また、パラメータを抽出するために同じパターンを使用していましたが、上記のように2番目の正規表現が必要でした。また、1行には1つの関数しかないので、1つのマッチを行うことができます。このコードは動作します:

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 
+0

機能が複合体を得ることはありません。 Paramsは単一の文字列です。私はMVCを使用しています。 – Mendes

+0

@Mendex、その場合は単純な正規表現があなたのために働くでしょう。だから私はリンクされている質問の正規表現は:http://stackoverflow.com/questions/18906514/regex-for-matching-functions-and-capturing-their-arguments/18908330#18908330 – acarlon

関連する問題