首页/开发/正则与编码速查/命名分组的反向引用写法
正则进阶45 条

命名分组的反向引用写法

命名反向引用用 \k<name> 或 (?P=name) 在同一条正则里再次引用某个命名分组匹配到的文本,用来强制配对(引号、标签、重复词)。各引擎写法不同,Python re 只支持 (?P=name),写错会直接编译失败。

正则与编码速查开发更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌​‌‌‌​​‌‌​​​​‌​‌‌​‌‌​‌​‌‌​​‌​‌​‌‌​​‌​​​​‌​‌‌​‌​‌‌​​‌‌‌​‌‌‌​​‌​​‌‌​‌‌‌‌​‌‌‌​‌​‌​‌‌‌​​​​​​‌​‌‌​‌​‌‌​​​‌​​‌‌​​​​‌​‌‌​​​‌‌​‌‌​‌​‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌​​‌​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

命名反向引用是什么

命名分组用 (?<name>…) 或 (?P<name>…) 给捕获内容起名字;反向引用则是在同一条正则里再次引用这个分组已经匹配到的文本,而不是重复它的模式写法。用 (?<q>['"])[^'"]*\k<q> 可以强制首尾是同一种引号,序号写法 \1 也能做到同样的事,只是分组一多就容易数错位置。

基本信息

命名分组(?<name>…) 与 (?P<name>…) 两种写法,后者来自 Perl 兼容风格
反向引用PCRE、PHP、Perl、Java、JS 用 \k<name>,PCRE、Perl 还支持 (?P=name)
Python re只认 (?P<name>…) 与 (?P=name),写成 \k<name> 会直接编译报错
引用语义引用的是分组匹配到的文本,不是模式本身,组名大小写严格区分

典型使用场景

  • 配对引号:匹配单引号或双引号字符串时保证首尾同符,避免把交叉写法当成合法内容
  • 重复标签:在规整的 HTML、XML 片段里要求开闭标签同名,例如 <b>…</b> 而不是 <b>…</i>
  • 连续重复词:抓日志或文案中紧挨着出现两次的同一个词,定位复制粘贴造成的重复
  • 同值约束:一行内要求两个字段取值一致,例如 key=value 且等号两侧必须完全相同
  • 配对分隔符:处理 {{name}}、{name} 这类模板占位符时复用同一条模式

四种等价写法

四种等价写法
(?<q>['"]).*?\k<q>              # PCRE、PHP、Java、JS 的命名反向引用
(?P<q>['"]).*?(?P=q)            # Python re:命名反向引用只能用 (?P=name)
(?<q>['"]).*?\1                # 退化成序号引用,可读性差但语义相同
(?<w>\w+)\s+\k<w>              # 抓连续重复的单词
(?<q>['"])(?:(?!\k<q>).)*\k<q>  # 引号内部不允许再出现同种引号

各引擎写法对照

引擎命名分组命名反向引用
PCRE / PHP / Perl(?<name>…) 或 (?P<name>…)\k<name> 或 (?P=name)
Python re(?P<name>…)(?P=name),不支持 \k 写法
JavaScript(?<name>…)\k<name>
Java(?<name>…)\k<name>
.NET(?<name>…) 或 (?'name'…)\k<name> 或 \k'name'
组名区分大小写,Name 与 name 是两个独立的组;引用一条本次匹配中没有参与的分组时,多数引擎按匹配失败处理,个别引擎直接报错,具体以官方文档为准。
命名组同样占用序号,在前面插入一个新的普通分组会让后面的 \1、\2 整体错位;同一模式里混用命名引用与序号引用并不推荐,维护时很难一眼看出对应关系。

易错点

  • 把反向引用当成复用模式:\k<name> 只引用分组匹配到的文本,想复用一段模式得靠递归、子程序调用或直接复制
  • 在 Python re 里套用 PCRE 的 \k<name>:会直接抛编译错误,跨语言搬运模式时这是最常见的失败原因
  • 忽略组名大小写:名字写错一个字母不报语法错误,而是模式永远匹配不上,排查成本很高
  • 在分支里引用另一个分支的组:组未参与匹配时整条模式失败,需要把引用放回同一分支或改用条件匹配
  • 误以为反向引用能处理嵌套结构:只能配到一层,多层嵌套要用递归子模式或平衡组,否则匹配结果静默错位

数据来源与参考

  • PCRE2 官方文档:pcre2pattern(Back references 章节)
  • Python 官方文档 re 模块:命名分组与反向引用
  • MDN:JavaScript 正则命名捕获组与 \k<name>

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/regex/named-group-backreference.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌​‌‌‌​​‌‌​​​​‌​‌‌​‌‌​‌​‌‌​​‌​‌​‌‌​​‌​​​​‌​‌‌​‌​‌‌​​‌‌‌​‌‌‌​​‌​​‌‌​‌‌‌‌​‌‌‌​‌​‌​‌‌‌​​​​​​‌​‌‌​‌​‌‌​​​‌​​‌‌​​​​‌​‌‌​​​‌‌​‌‌​‌​‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌​​‌​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​