Regex zum Parsen von Funktionen mit beliebiger Tiefe

Ich analysiere eine einfache Sprache (Excel-Formeln) für die darin enthaltenen Funktionen. Ein Funktionsname muss mit einem beliebigen Buchstaben beginnen, gefolgt von einer beliebigen Anzahl von Buchstaben / Zahlen, und mit einem offenen Paren enden (keine Leerzeichen dazwischen). Zum BeispielMyFunc(. Die Funktion kann beliebige Argumente enthalten, einschließlich anderer Funktionen, und muss mit einem nahen paren @ ende). Natürlich ist Mathe innerhalb der Eltern erlaubt=MyFunc((1+1)) und(1+1) sollte nicht als Funktion erkannt werden, da es die gerade beschriebene Funktionsregel nicht erfüllt. Mein Ziel ist es, die Funktionsaufrufe der höchsten Ebene in einer Formel zu erkennen, den Funktionsnamen zu identifizieren und die Argumente zu extrahieren. Mit den Argumenten kann ich rekursiv nach anderen Funktionsaufrufen suchen.

Mit diesemLernprogram Ich habe die folgenden Regexes gehackt. Keiner scheint den Trick zu tun. Beide schlagen in dem unten eingefügten Testfall fehl.

Diessollt Arbeit scheitert aber komplett:

(?<name>[a-z][a-z0-9]*\()(?<body>(?>[a-z][a-z0-9]*\((?<DEPTH>)|\)(?<-DEPTH>)|.?)*(?(DEPTH)(?!)))\)

Dies funktioniert für viele Testfälle, schlägt jedoch für die folgenden Testfälle fehl. Ich denke nicht, dass es verschachtelte Funktionen richtig handhabt - es sucht nur nach open paren / close paren in der Verschachtelung:

(?<name>[a-z][a-z0-9]*\()(?<body>(?>\((?<DEPTH>)|\)(?<-DEPTH>)|.?)*(?(DEPTH)(?!)))\)

Hier ist der Test, der sie alle bricht:

=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

Dies sollte übereinstimmen als:

Date(ARGUMENTS1)
Weekday(ARGUMENTS2)
Where ARGUMENTS2 = Date(Year(A$5),Month(A$5),1)

Stattdessen passt es:

ARGUMENTS2 = Date(Year(A$5),Month(A$5),1)-1)

Ich verwende .net RegEx, das externen Speicher zur Verfügung stellt.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage