遇到此问题,我已经搜索了几天。我正在使用PHP解析平台的公式。
公式可能类似于:
object.Field
ADD(object.NumberOfTHings, object.NumberOfThings)
object.DoSomething(ADD(object.NumberOfTHings, object.NumberOfThings), 'words!')
想法是,它可以嵌套许多级别。用户也可以添加引号(双引号和单引号)。
我正在研究一个函数,它将以最高级别返回每个参数。所以
object.DoSomething(ADD(object.NumberOfTHings, object.NumberOfThings), 'words!')
将需要返回以下数组:
然后,我们返回并适当地解析每个参数(有些是对象调用,函数调用等)。我愿意一次解析所有内容,但认为那只会更加复杂。
我当前的正则表达式如下:
\(?'pullsinglequotes'\'.+?\')|(?'pulldoublequotes'\".+?\")|(?'pullfunctions'[^,]\(([^()]|(?R))*\))\
它大部分都可以工作,但是有两个问题:
以下是REGEXR的问题: https://regexr.com/41e20
我尝试过REGEX的许多不同变体,每个变体都有其缺点。
我的问题是:是否有人拥有足够的正则表达式知识来解决这两个问题?如果是这样,任何帮助将不胜感激。
更新 如果有人感兴趣,以下是我最后的正则表达式。
/(?'pullsinglequotes'\'.+?\')|(?'pulldoublequotes'\".+?\")|(?'pullfunctions'\b[\w.]+\s*\(([^()]|(?R))*\))|(?'pullvars'\w+(?:\.\w+)?)/
答案 0 :(得分:0)
您的pullfunctions
仅匹配一个不是,
的字符,后跟一个括号。允许其重复并在其之前加上单词边界。
对于var和object,只需使用带有可选的点分隔部分的重复单词字符。您可以将其调整为一个字符组,以允许其他字符,例如-
或_
。
完整正则表达式:
(?'pullsinglequotes'\'.+?\')|(?'pulldoublequotes'\".+?\")|(?'pullfunctions'\b[\w]+\s*\(([^()]|(?R))*\))|(?'pullvars'\w+(?:\.\w+)?)