後行斷言:(?<=...), (?<!...)

Baseline 已廣泛支援

此功能已成熟,並可在許多裝置和瀏覽器版本上執行。自 2023 年 3 月以來,它已在各種瀏覽器中可用。

後行斷言“向後看”:它嘗試將給定模式與之前的輸入進行匹配,但它不消耗任何輸入——如果匹配成功,輸入中的當前位置保持不變。它以相反的順序匹配其模式中的每個原子。

語法

正則表示式
(?<=pattern)
(?<!pattern)

引數

pattern

此模式可以包含任何可在正則表示式字面量中使用的內容,包括或運算子

描述

正則表示式通常從左到右匹配。這就是先行斷言和後行斷言之所以如此命名的原因——先行斷言斷言右側的內容,後行斷言斷言左側的內容。

為了使 (?<=pattern) 斷言成功,pattern 必須匹配當前位置左側緊鄰的輸入,但在匹配後續輸入之前,當前位置不會改變。(?<!pattern) 形式否定了斷言——如果 pattern 不匹配當前位置左側緊鄰的輸入,則它成功。

後行斷言的語義通常與先行斷言相同——但是,在後行斷言中,正則表示式是向後匹配的。例如,

js
/(?<=([ab]+)([bc]+))$/.exec("abc"); // ['', 'a', 'bc']
// Not ['', 'ab', 'c']

如果後行斷言從左到右匹配,它應該首先貪婪地匹配 [ab]+,這使得第一個組捕獲 "ab",剩餘的 "c"[bc]+ 捕獲。然而,由於 [bc]+ 首先匹配,它貪婪地抓取 "bc",只留下 "a"[ab]+

這種行為是合理的——匹配器不知道從哪裡開始匹配(因為後行斷言可能不是固定長度),但它知道在哪裡結束(在當前位置)。因此,它從當前位置開始並向後工作。(某些其他語言中的正則表示式禁止非固定長度的後行斷言,以避免此問題。)

對於後行斷言中的量詞捕獲組,由於向後匹配,捕獲的是輸入字串中最左側的匹配——而不是最右側的。有關更多資訊,請參閱捕獲組頁面。後行斷言中的反向引用必須出現在其所引用的組的左側,這也是由於向後匹配。然而,或運算子仍然是從左到右嘗試的。

示例

匹配字串而不消耗它們

先行斷言類似,後行斷言可用於匹配字串而不消耗它們,以便只提取有用的資訊。例如,以下正則表示式匹配價格標籤中的數字

js
function getPrice(label) {
  return /(?<=\$)\d+(?:\.\d*)?/.exec(label)?.[0];
}

getPrice("$10.53"); // "10.53"
getPrice("10.53"); // undefined

透過捕獲您感興趣的子匹配項,也可以實現類似的效果。

規範

規範
ECMAScript® 2026 語言規範
# prod-Assertion

瀏覽器相容性

另見