RegExp.prototype.sticky
Базовый уровень Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Свойство-аксессор sticky экземпляров RegExp возвращает, используется ли флаг y с этим регулярным выражением.
Попробуйте
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
Описание
RegExp.prototype.sticky имеет значение true, если использовался флаг y; в противном случае — false. Флаг y указывает, что регулярное выражение пытается найти совпадение в целевой строке только начиная с индекса, указанного свойством lastIndex (и, в отличие от глобального регулярного выражения, не пытается найти совпадение с каких-либо более поздних индексов).
Сет-аксессор sticky — это undefined. Вы не можете изменить это свойство напрямую.
Как для прилипающих регулярных выражений, так и для глобальных регулярных выражений:
- Они начинают сопоставление с
lastIndex. - Когда сопоставление успешно,
lastIndexпродвигается до конца совпадения. - Когда
lastIndexвыходит за пределы текущей сопоставленной строки,lastIndexсбрасывается в 0.
Однако для метода exec() поведение при неудачном сопоставлении отличается:
- Когда метод
exec()вызывается для прилипающего регулярного выражения, если регулярное выражение не находит совпадения вlastIndex, оно немедленно возвращаетnullи сбрасываетlastIndexв 0. - Когда метод
exec()вызывается для глобального регулярного выражения, если регулярное выражение не находит совпадения вlastIndex, оно пытается найти совпадение со следующего символа и так далее, пока не будет найдено совпадение или не будет достигнут конец строки.
Для метода exec() регулярное выражение, которое является и прилипающим, и глобальным, ведёт себя так же, как прилипающее и неглобальное регулярное выражение. Поскольку test() является простой обёрткой вокруг exec(), test() будет игнорировать глобальный флаг и выполнять прилипающие сопоставления. Однако, поскольку многие другие методы по-особому обрабатывают поведение глобальных регулярных выражений, глобальный флаг, как правило, ортогонален прилипающему флагу.
-
String.prototype.matchAll()(который вызываетRegExp.prototype[Symbol.matchAll]()):y,gиgyвсе отличаются.- Для
yрегулярных выражений:matchAll()вызывает исключение;[Symbol.matchAll]()выдает результатexec()ровно один раз, не обновляяlastIndexрегулярного выражения. - Для
gилиgyрегулярных выражений: возвращает итератор, который выдает последовательность результатовexec().
- Для
-
String.prototype.match()(который вызываетRegExp.prototype[Symbol.match]()):y,gиgyвсе отличаются.- Для
yрегулярных выражений: возвращает результатexec()и обновляетlastIndexрегулярного выражения. - Для
gилиgyрегулярных выражений: возвращает массив всех результатовexec().
- Для
-
String.prototype.search()(который вызываетRegExp.prototype[Symbol.search]()): флагgвсегда не имеет значения.- Для
yилиgyрегулярных выражений: всегда возвращает0(если совпадает самое начало строки) или-1(если начало не совпадает), не обновляяlastIndexрегулярного выражения при выходе. - Для
gрегулярных выражений: возвращает индекс первого совпадения в строке или-1, если совпадений не найдено.
- Для
-
String.prototype.split()(который вызываетRegExp.prototype[Symbol.split]()):y,gиgyимеют одинаковое поведение. -
String.prototype.replace()(который вызываетRegExp.prototype[Symbol.replace]()):y,gиgyвсе отличаются.- Для
yрегулярных выражений: выполняет замену один раз в текущемlastIndexи обновляетlastIndex. - Для
gиgyрегулярных выражений: заменяет все вхождения, соответствующиеexec().
- Для
-
String.prototype.replaceAll()(который вызываетRegExp.prototype[Symbol.replace]()):y,gиgyвсе отличаются.- Для
yрегулярных выражений:replaceAll()вызывает исключение. - Для
gиgyрегулярных выражений: заменяет все вхождения, соответствующиеexec().
- Для
Примеры
Использование регулярного выражения с прилипающим флагом
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)
Якорный прилипающий флаг
В течение нескольких версий в движке SpiderMonkey браузера Firefox существовал баг, связанный с утверждением ^ и прилипающим флагом, который позволял выражениям, начинающимся с утверждения ^ и использующим прилипающий флаг, находить совпадение там, где они не должны были. Ошибка была введена через некоторое время после Firefox 3.6 (в котором был прилипающий флаг, но не было этой ошибки) и исправлена в 2015 году. Возможно, из-за этой ошибки спецификация особо отмечает тот факт, что:
Даже когда флаг
yиспользуется с шаблоном,^всегда совпадает только в начале Input или (если rer.[[Multiline]] равноtrue) в начале строки.
Примеры корректного поведения:
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
Спецификации
Совместимость с браузерами
| Десктопные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
sticky |
49 |
13 |
3 |
36 |
10 |
49 |
4 |
36 |
10 |
5.0 |
49 |
10 |
1.0.0 |
1.0 |
6.0.0 |
anchored_sticky_flag |
49 |
13 |
44 |
36 |
10 |
49 |
44 |
36 |
10 |
5.0 |
49 |
10 |
1.0.0 |
1.0 |
6.0.0 |
prototype_accessor |
49 |
13 |
38 |
36 |
10 |
49 |
38 |
36 |
10 |
5.0 |
49 |
10 |
1.0.0 |
1.0 |
6.0.0 |
Смотрите также
- Полифилл флага
stickyвcore-js RegExp.prototype.lastIndexRegExp.prototype.dotAllRegExp.prototype.globalRegExp.prototype.hasIndicesRegExp.prototype.ignoreCaseRegExp.prototype.multilineRegExp.prototype.sourceRegExp.prototype.unicode
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/sticky