【问题标题】:Regex to extract function-name, & it's parameters正则表达式提取函数名及其参数
【发布时间】:2017-03-07 00:36:21
【问题描述】:

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

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

例如,

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#构建的

提前感谢您的帮助。

【问题讨论】:

  • 带有函数的表达式不是正则语言,所以不能假设能够用正则表达式解析它们。

标签: c# regex


【解决方案1】:
 "^\s*(\w+)\s*\((.*)\)"

group(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))) ),我的代码将无法工作。

【讨论】:

  • 这行不通。以Round(1) + Round(2) 为例。
  • 好吧,我以为每行只有一个函数,如示例所示。
  • 表达式也可以有嵌套函数。对于前轮(地板(1300 + 0.234 - 1.765),1)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    Regex for matching Functions and Capturing their Arguments 帖子中,您可以使用 Kent 正则表达式提取您的函数,并使用此代码从最后一组中提取参数:

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

    【讨论】:

      猜你喜欢
      • 2017-01-26
      • 2015-07-08
      • 2018-11-28
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      相关资源
      最近更新 更多