2014-01-06 2 views
5

У меня есть следующая строка:Regex для синтаксического анализа функции и параметры

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

Мне нужен код Regex для разбора его как массив строк:

function 
param1 
param2 
param3 
param4 
. 
. 
. 
paramN 

Я попытался несколько примеров в сеть, но никто из них, похоже, не работает для меня.

[EDIT]

Не WOKING с предложением. Проверьте код выше:

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. Суть состоит в том, чтобы разбить регулярное выражение на две проблемы. Сначала введите имя функции, затем параметры.

В целом, это будет извлечь имя функции:

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

Для параметров, это обрабатывает параметры, а также функции по параметрам:

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

Это будет обрабатывать вложенные функции:

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

Но, если вам нужно поддерживать полный синтаксис C#, это становится сложным быстро, например комментарии в параметрах и т. д. См. here для обсуждения.

Обновление на основе комментариев

Извинения, некоторые ошибки в копировании, что я пропустил (теперь исправлено). Вам не хватало первый \ в функции regex. Вы также использовали один и тот же шаблон для извлечения параметров, тогда как вам нужно второе регулярное выражение, как описано выше. Кроме того, поскольку в каждой строке есть только одна функция, вы можете просто выполнить одно совпадение. Этот код будет работать:

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

Функция не получит комплекс. Парамы - это только одиночные строки. Я использую MVC. – Mendes

+0

@Mendex, в этом случае простое регулярное выражение будет работать для вас. Так будет регулярное выражение в вопросе, который я связал: http://stackoverflow.com/questions/18906514/regex-for-matching-functions-and-capturing-their-arguments/18908330#18908330 – acarlon

Смежные вопросы