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 sticky là undefined. 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
lastIndexvượ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ạilastIndex, regex ngay lập tức trả vềnullvà đặt lạilastIndexvề 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ạilastIndex, 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.
String.prototype.matchAll()(gọiRegExp.prototype[Symbol.matchAll]()):y,gvàgyđều khác nhau.- Đối với regex
y:matchAll()ném;[Symbol.matchAll]()tạo ra kết quảexec()đúng một lần, mà không cập nhậtlastIndexcủa regex. - Đối với regex
ghoặcgy: trả về một iterator tạo ra một chuỗi kết quảexec().
- Đối với regex
String.prototype.match()(gọiRegExp.prototype[Symbol.match]()):y,gvàgyđều khác nhau.- Đối với regex
y: trả về kết quảexec()và cập nhậtlastIndexcủa regex. - Đối với regex
ghoặcgy: trả về một mảng tất cả các kết quảexec().
- Đối với regex
String.prototype.search()(gọiRegExp.prototype[Symbol.search]()): cờgluôn không liên quan.- Đối với regex
yhoặcgy: luôn trả về0(nếu đầu chuỗi khớp) hoặc-1(nếu đầu chuỗi không khớp), mà không cập nhậtlastIndexcủa regex khi thoát. - Đối với regex
g: trả về chỉ mục của kết quả khớp đầu tiên trong chuỗi, hoặc-1nếu không tìm thấy kết quả khớp.
- Đối với regex
String.prototype.split()(gọiRegExp.prototype[Symbol.split]()):y,g, vàgyđều có cùng hành vi.String.prototype.replace()(gọiRegExp.prototype[Symbol.replace]()):y,gvàgyđều khác nhau.- Đối với regex
y: thay thế một lần tạilastIndexhiện tại và cập nhậtlastIndex. - Đối với regex
gvàgy: thay thế tất cả các lần xuất hiện được khớp bởiexec().
- Đối với regex
String.prototype.replaceAll()(gọiRegExp.prototype[Symbol.replace]()):y,gvàgyđều khác nhau.- Đối với regex
y:replaceAll()ném. - Đối với regex
gvàgy: thay thế tất cả các lần xuất hiện được khớp bởiexec().
- Đối với regex
Ví dụ
>Sử dụng biểu thức chính quy với cờ sticky
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:
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> |