RegExp.prototype.sticky

Baseline Widely available

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

Thuộc tính accessor sticky của các instance RegExp trả về liệu cờ y có được sử dụng với biểu thức chính quy này hay không.

Try it

const str = "table football";
const regex = /foo/y;

regex.lastIndex = 6;

console.log(regex.sticky);
// Expected output: true

console.log(regex.test(str));
// Expected output: true

console.log(regex.test(str));
// Expected output: false

Mô tả

RegExp.prototype.sticky có giá trị true nếu cờ y được sử dụng; ngược lại là false. Cờ y chỉ ra rằng regex cố gắng khớp chuỗi đích chỉ từ chỉ mục được chỉ định bởi thuộc tính lastIndex (và không giống như regex global, không cố gắng khớp từ bất kỳ chỉ mục nào sau đó).

Accessor set của stickyundefined. Bạn không thể thay đổi thuộc tính này trực tiếp.

Đối với cả regex sticky và global:

  • Chúng bắt đầu khớp tại lastIndex.
  • Khi khớp thành công, lastIndex được tăng đến cuối kết quả khớp.
  • Khi lastIndex vượt ra ngoài phạm vi của chuỗi hiện đang được khớp, lastIndex được đặt lại về 0.

Tuy nhiên, đối với phương thức exec(), hành vi khi khớp thất bại là khác nhau:

  • Khi phương thức exec() được gọi trên một regex sticky, nếu regex thất bại khi khớp tại lastIndex, regex ngay lập tức trả về null và đặt lại lastIndex về 0.
  • Khi phương thức exec() được gọi trên một regex global, nếu regex thất bại khi khớp tại lastIndex, nó thử khớp từ ký tự tiếp theo, và cứ thế tiếp tục cho đến khi tìm thấy kết quả khớp hoặc đến cuối chuỗi.

Đối với phương thức exec(), một regex vừa sticky vừa global hoạt động giống như một regex sticky và không global. Vì test() là một wrapper đơn giản xung quanh exec(), test() sẽ bỏ qua cờ global và thực hiện khớp sticky. Tuy nhiên, do nhiều phương thức khác xử lý đặc biệt hành vi của regex global, cờ global thường là trực giao với cờ sticky.

Ví dụ

Sử dụng biểu thức chính quy với cờ sticky

js
const str = "#foo#";
const regex = /foo/y;

regex.lastIndex = 1;
regex.test(str); // true
regex.lastIndex = 5;
regex.test(str); // false (lastIndex is taken into account with sticky flag)
regex.lastIndex; // 0 (reset after match failure)

Cờ sticky được neo

Trong nhiều phiên bản, engine SpiderMonkey của Firefox đã có một lỗi liên quan đến xác nhận ^ và cờ sticky cho phép các biểu thức bắt đầu bằng xác nhận ^ và sử dụng cờ sticky khớp khi chúng không nên. Lỗi được giới thiệu vào một thời điểm nào đó sau Firefox 3.6 (có cờ sticky nhưng không có lỗi) và được sửa vào năm 2015. Có thể vì lỗi, đặc tả cụ thể đề cập rằng:

Ngay cả khi cờ y được sử dụng với một mẫu, ^ luôn chỉ khớp ở đầu Input, hoặc (nếu rer.[[Multiline]] là true) ở đầu một dòng.

Ví dụ về hành vi đúng:

js
const regex1 = /^foo/y;
regex1.lastIndex = 2;
regex1.test("..foo"); // false - index 2 is not the beginning of the string

const regex2 = /^foo/my;
regex2.lastIndex = 2;
regex2.test("..foo"); // false - index 2 is not the beginning of the string or line
regex2.lastIndex = 2;
regex2.test(".\nfoo"); // true - index 2 is the beginning of a line

Đặc tả kỹ thuật

Specification
ECMAScript® 2027 Language Specification
# sec-get-regexp.prototype.sticky

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

Xem thêm