我正在为其中包含的函数解析一种简单的语言(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。