正则表达式:拆分函数调用参数

时间:2018-10-17 18:02:47

标签: php regex function parsing

遇到此问题,我已经搜索了几天。我正在使用PHP解析平台的公式。

公式可能类似于:

object.Field

ADD(object.NumberOfTHings, object.NumberOfThings)

object.DoSomething(ADD(object.NumberOfTHings, object.NumberOfThings), 'words!')

想法是,它可以嵌套许多级别。用户也可以添加引号(双引号和单引号)。

我正在研究一个函数,它将以最高级别返回每个参数。所以

object.DoSomething(ADD(object.NumberOfTHings, object.NumberOfThings), 'words!')

将需要返回以下数组:

  • ADD(object.NumberOfTHings,object.NumberOfThings)
  • “单词!”

然后,我们返回并适当地解析每个参数(有些是对象调用,函数调用等)。我愿意一次解析所有内容,但认为那只会更加复杂。

我当前的正则表达式如下:

\(?'pullsinglequotes'\'.+?\')|(?'pulldoublequotes'\".+?\")|(?'pullfunctions'[^,]\(([^()]|(?R))*\))\

它大部分都可以工作,但是有两个问题:

  1. 还不会返回对象(例如,如果我引用object.Field作为参数)。
  2. 仅包含函数的最后一个字母。

以下是REGEXR的问题: https://regexr.com/41e20

我尝试过REGEX的许多不同变体,每个变体都有其缺点。

我的问题是:是否有人拥有足够的正则表达式知识来解决这两个问题?如果是这样,任何帮助将不胜感激。

更新 如果有人感兴趣,以下是我最后的正则表达式。

/(?'pullsinglequotes'\'.+?\')|(?'pulldoublequotes'\".+?\")|(?'pullfunctions'\b[\w.]+\s*\(([^()]|(?R))*\))|(?'pullvars'\w+(?:\.\w+)?)/

1 个答案:

答案 0 :(得分:0)

您的pullfunctions仅匹配一个不是,的字符,后跟一个括号。允许其重复并在其之前加上单词边界。

对于var和object,只需使用带有可选的点分隔部分的重复单词字符。您可以将其调整为一个字符组,以允许其他字符,例如-_

完整正则表达式:

(?'pullsinglequotes'\'.+?\')|(?'pulldoublequotes'\".+?\")|(?'pullfunctions'\b[\w]+\s*\(([^()]|(?R))*\))|(?'pullvars'\w+(?:\.\w+)?)