反向引用:\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

瀏覽器相容性

另見