正则表达式提取函数名称, 39;进行实质性的s参数
本文关键字:实质性 参数 函数 提取 正则表达式 | 更新日期: 2023-09-27 18:10:41
我正在构建一个应用程序,其中用户可以为某些字段指定表达式。表达式也应该包含函数。我需要评估这些表达式并在报告中显示最终值。
我有一个表达式来提取function-name &它是目的。以前,函数参数是十进制值。但是现在,参数也可以是表达式。
为例,
Round( 1 * (1+ 1 /100) % (2 -1), 0)
Function-name : Round
Parameter1 : 1 * (1+ 1 /100) % (2 -1)
Parameter2 : 0
之前正则表达式:
string pattern2 = @"([a-zA-Z]{1,})[[:blank:]]{0,}'(([^'(')]{0,})')";
这个正则表达式不再帮助我找到表达式参数。
有人能帮我用正确的正则表达式来提取函数-name &参数?我实现了Math类支持的所有或大部分功能。该程序是用c#构建的
提前感谢您的帮助。
"^'s*('w+)'s*'((.*)')"
group(1) is函数名
将group(2)与","
分开,得到para list。
因为我没有Windows系统。Net),我用python进行了测试。嵌套函数不是问题。如果我们在表达式的开头加上"^'s*":
import re
s="Round(floor(1300 + 0.234 - 1.765), 1)"
m=re.match("^'s*('w+)'s*'((.*)')",s)
m.group(1)
Output: 'Round'
m.group(2)
Output: 'floor(1300 + 0.234 - 1.765), 1'
you can split if you like:
m.group(2).split(',')[0]
Out: 'floor(1300 + 0.234 - 1.765)'
m.group(2).split(',')[1]
Out: ' 1'
好吧,如果你的函数嵌套像f(a(b,c(x,y)),foo, m(j,k(n,o(i,u))) )
,我的代码将无法工作
您可以尝试编写一个解析器,而不是使用正则表达式。
Irony库(在我看来)非常容易使用,并且在示例中有一些非常类似于您正在尝试做的事情。
从匹配函数和捕获其参数的post正则表达式中,您可以使用Kent正则表达式提取函数,并使用以下代码从最后一组中提取参数:
string extractArgsRegex = @"(?:[^,()]+((?:'((?>[^()]+|'((?<open>)|')(?<-open>))*')))*)+";
var ArgsList = Regex.Matches(m.Groups[m.Groups.Count - 1].Value, extractArgsRegex);