我正在构建一个应用程序,用户可以在其中为某些字段指定表达式。表达式也应包含函数。我需要评估这些表达式并在报告中显示最终值。
我有一个表达式来提取功能名称&这是参数。以前,函数参数是十进制值。但现在,参数也可以表达。
对于前,
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,})\)";
这个正则表达式不再帮助我找到表达式参数。
有人可以帮助我使用正确的正则表达式来提取函数名称&参数?我实现了Math类支持的全部或大部分功能。 该程序是用c#
构建的提前感谢您的帮助。
答案 0 :(得分:2)
"^\s*(\w+)\s*\((.*)\)"
组(1)是功能名称
拆分组(2)与","
你得到参数列表。
<强>更新强>
由于我没有Windows系统(.Net),我用python测试它。嵌套函数不是问题。如果我们添加&#34; ^ \ s *&#34;在表达式的开头: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))) )
,我的代码将无法正常工作。
答案 1 :(得分:1)
您可以尝试编写解析器,而不是使用正则表达式 Irony库(在我看来)非常容易使用,在示例中有一些与您尝试的非常相似的东西。
答案 2 :(得分:0)
从帖子Regex for matching Functions and Capturing their Arguments,您可以使用Kent regex提取您的函数,并使用此代码从最后一组中提取参数:
string extractArgsRegex = @"(?:[^,()]+((?:\((?>[^()]+|\((?<open>)|\)(?<-open>))*\)))*)+";
var ArgsList = Regex.Matches(m.Groups[m.Groups.Count - 1].Value, extractArgsRegex);