反向引用在替换中用 $1、$2 等语法将捕获组内容原样插入,编号按左括号顺序从1开始;命名捕获组可用 $;不同工具语法不同,如 python 用 $1、sed 用 \1;需注意括号缺失、转义错误、编号越界等问题。

反向引用在替换中,核心是把前面括号里捕获到的内容“原样搬过来”,用 $1、$2 这样的语法插入到替换字符串里,而不是重新写死内容。
替换时用 $1、$2 引用捕获组
正则引擎在匹配过程中会把每个 () 里的内容记下来,编号从 1 开始。替换时直接用 $1 表示第一个括号匹配到的文本,$2 表示第二个,依此类推。
- 比如把
John Doe改成Doe, John:匹配模式是(\w+) (\w+),替换写成$2, $1 - 注意:必须用
$开头(如$1),不能写成\1—— 那是匹配时用的语法 - 如果用了命名捕获组,比如
(?<first>\w+)</first>,替换中可用$<first></first>
常见工具中的写法差异
不同工具对反向引用的支持略有不同,但基本一致:
-
Python 的 re.sub():支持
$1、$<name></name>,不支持\1在替换串里 -
sed(GNU):用
\1、\2,不是$1;例如sed 's/\([^ ]*\) \([^ ]*\)/\2, \1/' -
VS Code / Sublime / Notepad++:统一用
$1、$2,支持$0表示整个匹配项 -
JavaScript 的 replace():支持
$1,也支持函数式替换,更灵活
容易出错的几个点
写错就不起作用,尤其要注意这些细节:
- 括号没写对:漏掉
()就没有捕获组,$1就是空的 - 引号混用导致转义混乱:在 Python 中推荐用 raw string 写正则,比如
r"(\d+)-(\d+)",替换串用普通字符串即可 - 编号越界:写了
$3但只定义了两个括号,结果就是字面量$3,不会报错但也不生效 - 嵌套括号计数要小心:左括号出现顺序决定编号,不是看嵌套层级
一个实用例子:清理重复单词
文本中出现 “the the” 或 “and and”,想删掉一个:
- 匹配模式:
\b(\w+)\s+\1\b(\1在匹配中确保两个单词相同) - 替换内容:
$1(只保留一份) - 效果:
"the the cat"→"the cat"











