首页/开发/正则与编码速查/捕获组编号顺序规则详解
正则基础45 条

捕获组编号顺序规则详解

捕获组按左括号出现的先后顺序编号,第 0 组固定是整个匹配,嵌套时外层编号小于内层,非捕获分组不占编号而断言内的捕获括号通常占号。插入新括号会让后续组号整体后移,导致替换引用错位。

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

编号是怎么分配的

捕获组编号按左括号出现的先后顺序逐个数,第一个左括号是第 1 组,第二个是第 2 组,与括号何时结束无关。嵌套时外层括号先出现,所以外层编号一定小于内层。

谁不占编号

只有真正捕获的括号才占用编号:非捕获分组不占,单纯用于包裹的写法若不带捕获语义也不占;而断言内部的捕获括号在多数引擎里照样占编号,这是组号突然对不上的常见原因。

基本信息

第 0 组整个匹配内容,由引擎固定提供
计数方式按左括号在模式中出现的先后顺序
嵌套顺序外层先计,内层后计
不占编号非捕获分组不参与编号
占编号的特例断言内部若使用捕获括号,会正常占用编号(视引擎实现)
命名分组多数引擎给命名分组同时保留数字编号与名字两种访问方式

典型使用场景

  • 替换字符串中使用组引用进行字段重排
  • 解析多层结构:外层捕获整体、内层分别捕获各段
  • 排查替换结果错位问题,先数清模式里有多少个捕获括号
  • 重构模式时评估插入新括号对既有引用的影响
  • 为可读性把数字编号换成命名分组

编号顺序演示

编号顺序演示
import re
# 外层先编号,内层后编号
m = re.search(r'((\d{4})-(\d{2}))-(\d{2})', '2026-10-17')
print(m.group(1))  # 外层:整段日期主体
print(m.group(2))  # 内层:年份
print(m.group(3))  # 内层:月份
print(m.group(4))  # 最后一个括号:日
re.search(r'(?:x)(y)', 'xy').group(1)   # 非捕获分组不占编号,y 是第 1 组
re.sub(r'(a)(b)', r'\2\1', 'ab')       # 替换时按编号重排内容

替换引用写法对照

环境引用第 1 组注意点
Python 替换串反斜杠加 1,或命名写法反斜杠在字符串里需写成原始字符串
JavaScript 替换串美元符号加 1两位数字会被当作两位组号
Java 替换串美元符号加 1组号回引用与模式内引用写法不同
sed 与 awk反斜杠加 1需注意 shell 对反斜杠的处理
引用组号时如果是两位数字,紧跟其后的数字可能被一起当作组号解析。想引用第 1 组再接一个数字,应使用花括号包裹或命名引用写法把组号边界写清楚。
组号与读取方式并非完全通用:有的引擎在同时存在命名与匿名分组时编号规则有额外约定。跨语言移植模式时,组号相关的替换逻辑建议逐条验证,不要照抄。

易错点

  • 在模式中间插入一个新的捕获括号,后续组号整体后移,替换结果全部错位
  • 误以为断言里的括号不占编号,引用时取到错误片段
  • 替换串里引用组号后紧跟数字,被解析成两位组号,输出异常
  • 把非捕获分组与捕获分组的写法混用,数括号时漏掉一个导致引用偏移

数据来源与参考

  • PCRE2 官方文档 pcre2pattern(3):捕获组编号规则
  • Python 官方文档 re 模块:分组编号与命名分组
  • Java 官方文档 java.util.regex.Matcher:组引用与命名组

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

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