Regex to extract function-name, & it's paramet

2020-07-18 05:48发布

I am building an application where the user can specify an expression for some fields. The expression shall contain functions too. I need to evaluate these expressions and display final value in report.

I had an expression to extract function-name & it's paramters. Previously, the function parameters were decimal values. But now, the parameters can also be expression.

For ex,

Round( 1  * (1+  1 /100) % (2 -1), 0)

Function-name : Round
Parameter1    : 1  * (1+  1 /100) % (2 -1)
Parameter2    : 0

Previous Regex:

string pattern2 = @"([a-zA-Z]{1,})[[:blank:]]{0,}\(([^\(\)]{0,})\)";

This regex does not help me anymore to find expression-parameters.

Can someone help me with the right regex to extract function-name & parameters? I am implement all or most of the functions supported by Math class. The program is built in c#

Thanks in advance for the help.

标签: c# regex
3条回答
贼婆χ
2楼-- · 2020-07-18 05:54

From the post Regex for matching Functions and Capturing their Arguments, you can extract your function using Kent regex and use this code to extract parameters form the last group :

string extractArgsRegex = @"(?:[^,()]+((?:\((?>[^()]+|\((?<open>)|\)(?<-open>))*\)))*)+";
var ArgsList = Regex.Matches(m.Groups[m.Groups.Count - 1].Value, extractArgsRegex);
查看更多
啃猪蹄的小仙女
3楼-- · 2020-07-18 05:56
 "^\s*(\w+)\s*\((.*)\)"

group(1) is function name

split group(2) with "," you get para list.

updated

since I don't have Windows system (.Net either), I test it with python. nested function is not a problem. if we add "^\s*" at the beginning of the expression:

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'

well, if your function nesting is like f(a(b,c(x,y)),foo, m(j,k(n,o(i,u))) ), my code won't work.

查看更多
欢心
4楼-- · 2020-07-18 06:15

You could try writing a parser, instead of using regular expressions.
The Irony library is (in my opinion) extremely easy to use, and in the examples there's something very similar to what you are trying to do.

查看更多
登录 后发表回答