反向引用: \1, \2
语法
正则表达式
\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 表仅在浏览器中加载