Разбор строки с фукцией
Имеется строка, в которой надо выделить функции и их входные данные.
Например, в строке x<=count((a=1)||(a=2))+sum((x-t)*2), результатом вывода должен быть словарь, где ключ название функции, а значение ее входные данные.
Пробовал использовать регулярное выражение (?<=((sum)|(count))\().*(?=\)), но оно в результате дает выражение до последней скобки (a=1)||(a=2))+sum((x-t)*2. А должно быть (a=1)||(a=2) и (x-t)*2.
Думаю искать подстроку с названием функции во входной строке и с помощью стека парсить входные данные.
Может кто-нибудь сталкивался с подобной задачей и имеет лучшее решение?
upd Пришел к такому решению
private static IEnumerable<FunctionInfo> FindFunctions(string formula, List<Function> functions)
{
formula = formula.Trim();
var function = $"^({string.Join("|", functions)})";
var regex = new Regex(function);
while (formula.Length > 0)
{
var match = regex.Match(formula);
if (match.Success)
{
formula = regex.Replace(formula, string.Empty, 1);
Stack<char> brackets = new Stack<char>();
brackets.Push(formula[0]);
var index = 1;
var result = new StringBuilder();
while (brackets.Count > 0)
{
if (formula[index] == '(')
brackets.Push(formula[index]);
else if (formula[index] == ')')
brackets.Pop();
if (brackets.Count > 0)
result.Append(formula[index]);
index++;
}
yield return new FunctionInfo((Function)Enum.Parse(typeof(Function), match.Value), result.ToString(), $"{match.Value}({result.ToString()})");
formula = formula.Remove(0, result.Length + 2);
}
else
{
formula = formula.Remove(0, 1);
}
}
}