反向引用: \1, \2

基线 广泛可用

此功能已得到很好的建立,并且可以在许多设备和浏览器版本上运行。它自以下时间起在浏览器中可用 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 语言规范
# prod-DecimalEscape

浏览器兼容性

BCD 表仅在浏览器中加载

另请参阅