反向引用:\1, \2

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

反向引用指的是前一个捕获组的子匹配,并匹配与该组相同的文本。对于命名捕获组,你可能更喜欢使用命名反向引用语法。

语法

正则表达式
\N

注意:N 不是一个字面字符。

参数

N

一个正整数,指代捕获组的编号。

描述

反向引用是一种匹配与先前捕获组匹配的相同文本的方法。捕获组从 1 开始计数,因此第一个捕获组的结果可以用 \1 引用,第二个用 \2,依此类推。\0 是 NUL 字符的字符转义

不区分大小写的匹配中,反向引用可以匹配与原始文本大小写不同的文本。

js
/(b)\1/i.test("bB"); // true

反向引用必须引用一个存在的捕获组。如果它指定的数字大于捕获组的总数,则会抛出语法错误。

js
/(a)\2/u; // SyntaxError: Invalid regular expression: Invalid escape

非 Unicode 模式下,无效的反向引用会变成传统的八进制转义序列。这是一种为了 Web 兼容性而弃用的语法,你不应该依赖它。

js
/(a)\2/.test("a\x02"); // true

如果引用的捕获组未匹配(例如,因为它属于或运算符中未匹配的替代),或者该组尚未匹配(例如,因为它位于反向引用的右侧),反向引用始终成功(如同它匹配空字符串)。

js
/(?:a|(b))\1c/.test("ac"); // true
/\1(a)/.test("a"); // true

示例

配对引号

以下函数匹配字符串中的 title='xxx'title="xxx" 模式。为了确保引号匹配,我们使用反向引用来引用第一个引号。访问第二个捕获组 ([2]) 将返回匹配引号字符之间的字符串

js
function parseTitle(metastring) {
  return metastring.match(/title=(["'])(.*?)\1/)[2];
}

parseTitle('title="foo"'); // 'foo'
parseTitle("title='foo' lang='en'"); // 'foo'
parseTitle('title="Named capturing groups\' advantages"'); // "Named capturing groups' advantages"

匹配重复单词

以下函数查找字符串中的重复单词(通常是拼写错误)。请注意,它使用 \w 字符类转义,它只匹配英文字母,不匹配任何带重音的字母或其他字母。如果你想要更通用的匹配,你可能需要按空格拆分字符串,并遍历结果数组。

js
function findDuplicates(text) {
  return text.match(/\b(\w+)\s+\1\b/i)?.[1];
}

findDuplicates("foo foo bar"); // 'foo'
findDuplicates("foo bar foo"); // undefined
findDuplicates("Hello hello"); // 'Hello'
findDuplicates("Hello hellos"); // undefined

规范

规范
ECMAScript® 2026 语言规范
# prod-DecimalEscape

浏览器兼容性

另见