使用PHP 5.5+正则表达式,我想使用命名反向引用来捕获一个组。
例如,我希望以下文字匹配:
1-1
2-2
但不是以下
8-7
但是,当我尝试使用反向引用时,PHP会将其标记为匹配:
/* This statement evaluates to 1 */
preg_match("/(?<one>[1-9])\-(?<two>\\g<one>)/", "8-7");
除了使用带编号的引用之外,还有其他解决方法吗?
答案 0 :(得分:2)
请参阅PCRE documentation的摘录:
为了与Oniguruma兼容,非Perl语法
\g
后跟 用尖括号或单引号括起来的名称或数字, 是一种替代语法,用于将子模式引用为 子程序,可能是递归的。请注意
\g{...}
(Perl语法)和\g<...>
(Oniguruma语法) 不是同义词。前者是后参考;后者是一个 子程序调用。
使用\g<one>
,您不会引用匹配,而是引用子模式,请参阅regex101.com上的说明。
的子模式
\g<one>
递归名为one
您需要使用\1
来实际匹配第一组中捕获的相同文本。
(?<one>[1-9])\-(?<two>\1)
或(对实际文本的命名反向引用),
(?<one>[1-9])\-(?<two>\g{one})
\1
匹配与第一次捕获最近匹配的文本相同的文本 组