^(?'a'1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.(?&a)$
我正在学习正则表达式,并遇到了这个问题,它没有捕获,255.255
但255.25
我的正则表达式怎么了?
如果我重复使用相同的模式,它将起作用
^(?:1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.(?:1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$
但是当我尝试使用名称捕获组时它不起作用 (?&a)
它取决于PCRE版本。从PCRE新闻10.30:
新的实现允许回溯到模式中的递归组调用,使其与Perl更兼容,并且还解决了其他一些以前很难做到的问题。
在PCRE v10.30之前:最初,默认情况下,递归组调用是原子的。
交替的顺序是陷阱,因为第一个成功的替代方案获胜。在您的情况下,如果1?[0-9]?[0-9]
匹配项为25(从未测试其他替代方案),则当正则表达式引擎尝试$
失败时,该组中就不可能进行回溯。您可以像这样解决写命名捕获的问题:
(?<a>1[0-9]{0,2}|[3-9][0-9]?|2(?:[0-4][0-9]?|5[0-5]?|[6-9])?|0)
它要更长一些,但是每个数字都遵循一条独特的成功道路:演示
从PCRE 10.30开始:在较新的PCRE版本中,递归组调用不再是原子的(可以在Perl中进行回溯),您的模式也可以这样工作:https : //3v4l.org/HUICY
请注意,实际上,regex101和PHP <7.3使用较旧的PCRE版本,其中递归组调用始终是原子的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句