Я разбираю простой язык (формулы Excel) для функций, содержащихся в нем.Имя функции должно начинаться с любой буквы, за которой следует любое количество букв / цифр, и заканчиваться открытым паренем (без пробелов между ними).Например MyFunc(
.Функция может содержать любые аргументы, включая другие функции, и должна заканчиваться паренем )
.Разумеется, математика в скобках допускается =MyFunc((1+1))
, и (1+1)
не следует обнаруживать как функцию, поскольку она не соответствует правилу функции, которое я только что описал.Моя цель - распознавать вызовы функций самого высокого уровня в формуле, определять имя функции, извлекать аргументы.С помощью аргументов я могу рекурсивно искать другие вызовы функций.
Используя это учебное пособие Я взломал следующие регулярные выражения.Никто, кажется, не делает трюк.Они оба терпят неудачу в тестовом примере, вставленном ниже.
Это должно работать, но полностью терпит неудачу:
(?<name>[a-z][a-z0-9]*\()(?<body>(?>[a-z][a-z0-9]*\((?<DEPTH>)|\)(?<-DEPTH>)|.?)*(?(DEPTH)(?!)))\)
Это работает для многих тестовых случаев, но не работает для тестового примера ниже,Я не думаю, что он правильно обрабатывает вложенные функции - он просто ищет открытых / закрытых парней во вложении:
(?<name>[a-z][a-z0-9]*\()(?<body>(?>\((?<DEPTH>)|\)(?<-DEPTH>)|.?)*(?(DEPTH)(?!)))\)
Вот тест, который разбивает их все:
=Date(Year(A$5),Month(A$5),1)-(Weekday(Date(Year(A$5),Month(A$5),1))-1)+{0;1;2;3;4;5}*7+{1,2,3,4,5,6,7}-1
Это должно соответствовать:
Date(ARGUMENTS1)
Weekday(ARGUMENTS2)
Where ARGUMENTS2 = Date(Year(A$5),Month(A$5),1)
Вместо этого оно соответствует:
ARGUMENTS2 = Date(Year(A$5),Month(A$5),1)-1)
Я использую .net RegEx, который обеспечивает внешнюю память.