2011-10-06 71 views
4

我正在构建一个应用程序,用户可以在其中指定一些表达式的某些字段。该表达式也应包含函数。我需要评估这些表达式并在报告中显示最终值。正则表达式来提取函数名称,它的参数

我有一个表达式来提取函数名称&它是参数。以前,函数参数是十进制值。但是现在,参数也可以表达。

对于离,

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#

在此先感谢您的帮助。

+5

表达与功能都没有正规的语言,所以你不能假设能够用正则表达式解析它们。 – Gabe

回答

2
"^\s*(\w+)\s*\((.*)\)" 

组(1)是函数名

分割组(2)","你对列表。

更新

,因为我没有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)))),我的代码将无法正常工作。

+0

这不起作用。以“Round(1)+ Round(2)”为例。 –

+0

好吧,我认为这将是每行只有一个函数,如示例所示。 – Kent

+0

表达式也可以有嵌套函数。对于前轮(楼层(1300 + 0.234 - 1.765),1) –

1

您可以尝试编写解析器,而不是使用正则表达式。
Irony库(在我看来)非常易于使用,并且在示例中有一些与您正在尝试执行的操作非常相似。

0

从后Regex for matching Functions and Capturing their Arguments,您可以使用正则表达式肯特提取您的功能,使用此代码以提取参数形成最后一组:

string extractArgsRegex = @"(?:[^,()]+((?:\((?>[^()]+|\((?<open>)|\)(?<-open>))*\)))*)+"; 
var ArgsList = Regex.Matches(m.Groups[m.Groups.Count - 1].Value, extractArgsRegex);