【发布时间】:2018-11-25 07:11:31
【问题描述】:
我有一个正则表达式,用于匹配 (val1 operator val2) 形式的表达式
这个正则表达式看起来像:
(\(\s*([a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*(ni|in|\*|\/|\+|\-|==|!=|>|>=|<|<=)\s*([a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*\))
这实际上很好并且符合我想要的,如您所见here in this demo
但是:D(黄油来了)
我想优化正则表达式本身,使其更具可读性和“紧凑性”。我搜索了如何做到这一点,我发现了一种叫做反向引用的东西,你可以在其中命名你的捕获组,然后稍后引用它们:
(\(\s*(?P<Val>[a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*(ni|in|\*|\/|\+|\-|==|!=|>|>=|<|<=)\s*(\g{Val})\s*\))
我将捕获表达式左侧的组命名为Val,后来我将其引用为(\g{Val}),现在问题是这个表达式,如您所见here只有表达式左侧与右侧完全相同的情况!例如(a==a) 或 (1==1) 与 (a==b) 等表达式不匹配!
现在的问题是:有没有办法引用模式而不是匹配的值?!
【问题讨论】:
-
在 PCRE 中,应该是
(?&Val),而不是\g{Val}。你的正则表达式引擎是什么? -
我正在使用 PHP 抱歉我忘了标记它