gpt4 book ai didi

php - 正则表达式反向引用来匹配不同的值

转载 作者:行者123 更新时间:2023-12-02 04:16:48 31 4
gpt4 key购买 nike

我有一个正则表达式,用于匹配 (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)!

现在的问题是:有没有办法引用模式而不是匹配的值?!

最佳答案

请注意,\g{N} 相当于 \1,即,与相同值匹配的反向引用 ,而不是相应捕获组匹配的模式。不过,这种语法更加灵活,因为您可以通过在数字之前使用 - 来定义与当前组相对的捕获组(即 \g {-2}(\p{L})(\d)\g{-2} 将匹配 a1a)。

PCRE 引擎允许 subroutine calls递归子模式。要重复组 1 的模式,请使用 (?1)(?&Val) 递归指定组 Val 的模式。

此外,您可以使用字符类来匹配单个字符,并考虑使用 ? 量词使正则表达式的某些部分成为可选:

(\(\s*(?P<Val>[a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*(ni|in|[*\/+-]|[=!><]=|[><])\s*((?&Val))\s*\))

请参阅regex demo

请注意,\'.*\'\[.*\] 可能匹配太多,请考虑替换为 \'[^\'] *\'\[[^][]*\]

关于php - 正则表达式反向引用来匹配不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56656321/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com