regex - 重用分支重置组与所有备选方案不匹配
问题描述
我正在尝试使用下面的 RegEx 验证 IPv4 地址
^((?|([0-9][0-9]?)|(1[0-9][0-9])|(2[0-5][0-5]))\.){3}(?2)$
在大多数情况下,正则表达式工作正常,直到 IP 地址的第 3 个八位字节。但有时在最后一个八位字节中,它只匹配分支重置组中的第一个备选方案,而完全忽略其他交替组。我知道分支重置组中的所有替代项都指的是同一个捕获组。我尝试了重用此 StackOverflow 帖子中描述的捕获组的建议。它部分工作。
解决方案
此页面上有关于此行为的说明:
https://www.pcre.org/original/doc/html/pcrepattern.html#SEC15
该文档指出:
对编号子模式的子例程调用始终引用模式中具有给定编号的第一个子模式。
使用该页面上的示例:
(?|(abc)|(def))(?1)
在 (?| 组内,括号照常编号,但编号在每个分支的开头重置。
数字将如下所示
(?|(abc)|(def))
1 1
这将匹配
abcabc
defabc
abcabc
但它不匹配
defdef
它不匹配defdef
,因为该模式将匹配第一个def
,但以下(?1)
将仅匹配第一个编号的子模式,即(abc)
查看正则表达式演示。