正则表达式提取函数名称,&# 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#构建的

提前感谢您的帮助。

正则表达式提取函数名称,&# 39;进行实质性的s参数

 "^'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);