捕获组按左括号顺序编号,索引0为完整匹配;(?:...)不占编号,命名组(?<name>...)兼具数字索引和键名访问,preg_match返回一维数组,preg_match_all默认返回按组分层的二维数组。

捕获组在正则表达式中用括号 () 定义,匹配时会把括号内子表达式的内容单独保存,并按左括号出现的顺序从 1 开始编号。整个匹配结果(即完整匹配字符串)始终放在索引 0 的位置。
捕获组编号严格按左括号顺序
每个 ( 对应一个捕获组编号,不管嵌套多深或是否被量词修饰。编号只看左括号出现的先后,不跳过、不重排。
-
(a)(b(c))包含三个捕获组:索引 1 →a,索引 2 →b(c),索引 3 →c -
(?:non-capturing)(hello)(world)只有索引 1 和 2 有效,?:不占编号 - 命名组如
(?<year>\d{4})同时拥有数字索引(比如 1)和字符串键名('year'),两者指向同一内容
preg_match 返回数组结构
调用 preg_match 后,$matches 是一维数组:
-
$matches[0]:完整匹配的字符串 -
$matches[1]:第一个捕获组内容(最左边第一个(匹配到的部分) -
$matches[2]:第二个捕获组内容 - 以此类推,没有捕获组则对应索引不存在
preg_match_all 默认返回二维数组
使用 preg_match_all 且未指定标志时,$matches 是二维数组,组织方式为“按组分层”:
-
$matches[0]:所有完整匹配项组成的数组 -
$matches[1]:所有第一个捕获组的匹配结果(一一对应$matches[0]中每一项) -
$matches[2]:所有第二个捕获组的匹配结果 - 例如匹配
/(\d{4})-(\d{2})/得到两个日期,则$matches[1]是年份列表,$matches[2]是月份列表
命名捕获组同时提供双索引访问
启用命名语法 (?<name>...) 后,结果数组既保留数字索引,也添加字符串键名:
-
$matches[1]和$matches['name']值相同 - 可用于增强代码可读性,尤其在多个捕获组并存时避免数括号出错
- 注意:命名组仍参与整体编号,不会改变其他组的数字索引顺序

















