第 4 课
捕获组与替换
分组、反向引用与替换模板。
捕获组 让正则「记住」匹配的一部分,从而支持提取、校验拆分与结构化查找替换。
编号分组
圆括号按从左到右产生编号:
模式:(\d{4})-(\d{2})-(\d{2}) 作用于 2026-05-28
| 组 | 值 |
|---|---|
$1 / \1 | 2026 |
$2 | 05 |
$3 | 28 |
在 JavaScript 替换回调中,match[1]、match[2] 等含义相同。
非捕获组
只需分组、不需捕获时用 (?: ... ):
(?:https?):// 把 scheme 分支分组,但不占用 $1。
后续增加可选前缀时,替换模板更稳定。
反向引用
模式内的 \1 引用第 1 组已匹配内容。经典例子:(['"]).*?\1 匹配首尾引号一致的字符串。
反向引用很强,也易在嵌套结构上误用——这也是不应单独用正则解析 HTML 的原因之一。
替换模板
编辑器与语言在替换串中使用 $1、$2 或 $&(整段匹配):
- 把
user_id=123改成userId: 123 - 将
DD/MM/YYYY重排为YYYY-MM-DD
务必在 多行 上预览替换,包括空字段与异常空格。
命名分组(现代 JavaScript)
(?<year>\d{4}) 可通过 match.groups.year 访问。长模式中命名分组更易读。
要点
让每个捕获对应 一个语义字段。若替换串需要十个 $n,考虑简化模式或改用解析器。