此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in English Always switch to English

反向引用:\1、\2

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.

反向引用指代先前某个捕获组的子匹配,其匹配的文本与该捕获组相同。对于具名捕获组,可能更倾向于使用具名反向引用语法。

语法

regex
\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

规范

Specification
ECMAScript® 2027 Language Specification
# prod-DecimalEscape

浏览器兼容性

参见