Lookbehind assertion: (?<=...), (?<!...)

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since March 2023.

Một lookbehind assertion "nhìn về phía sau": nó cố gắng khớp đầu vào trước đó với pattern đã cho, nhưng nó không tiêu thụ bất kỳ đầu vào nào — nếu kết quả khớp thành công, vị trí hiện tại trong đầu vào vẫn giữ nguyên. Nó khớp từng atom trong pattern của nó theo thứ tự ngược lại.

Cú pháp

regex
(?<=pattern)
(?<!pattern)

Tham số

pattern

Một pattern bao gồm bất cứ thứ gì bạn có thể sử dụng trong một regex literal, bao gồm cả disjunction.

Mô tả

Một regular expression thường khớp từ trái sang phải. Đây là lý do tại sao các assertions lookahead và lookbehind được gọi như vậy — lookahead xác nhận những gì ở bên phải, và lookbehind xác nhận những gì ở bên trái.

Để một assertion (?<=pattern) thành công, pattern phải khớp với đầu vào ngay ở bên trái của vị trí hiện tại, nhưng vị trí hiện tại không thay đổi trước khi khớp đầu vào tiếp theo. Dạng (?<!pattern) phủ định assertion — nó thành công nếu pattern không khớp với đầu vào ngay ở bên trái của vị trí hiện tại.

Lookbehind thường có cùng ngữ nghĩa như lookahead — tuy nhiên, trong một lookbehind assertion, regular expression khớp ngược. Ví dụ,

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

Nếu lookbehind khớp từ trái sang phải, nó trước tiên nên tham lam khớp [ab]+, làm cho nhóm đầu tiên ghi lại "ab", và "c" còn lại được ghi lại bởi [bc]+. Tuy nhiên, vì [bc]+ được khớp trước, nó tham lam lấy "bc", chỉ để lại "a" cho [ab]+.

Hành vi này là hợp lý — matcher không biết bắt đầu kết quả khớp ở đâu (vì lookbehind có thể không có độ dài cố định), nhưng nó biết kết thúc ở đâu (tại vị trí hiện tại). Do đó, nó bắt đầu từ vị trí hiện tại và làm việc ngược lại. (Regexes trong một số ngôn ngữ khác cấm lookbehind không cố định độ dài để tránh vấn đề này.)

Đối với các capturing groups được lượng hóa bên trong lookbehind, kết quả khớp ở ngoài cùng bên trái của chuỗi đầu vào — thay vì kết quả ở bên phải — được ghi lại do khớp ngược. Xem trang capturing groups để biết thêm thông tin. Backreferences bên trong lookbehind phải xuất hiện ở bên trái của nhóm nó đang tham chiếu, cũng do khớp ngược. Tuy nhiên, disjunctions vẫn được thử từ trái sang phải.

Ví dụ

Khớp chuỗi mà không tiêu thụ chúng

Tương tự như lookaheads, lookbehinds có thể được sử dụng để khớp chuỗi mà không tiêu thụ chúng để chỉ trích xuất thông tin hữu ích. Ví dụ, regex sau khớp số trong nhãn giá:

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

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

Có thể đạt được hiệu ứng tương tự bằng cách ghi lại kết quả khớp con bạn quan tâm.

Thông số kỹ thuật

Specification
ECMAScript® 2027 Language Specification
# prod-Assertion

Tương thích trình duyệt

Xem thêm