Spec-Zone.ru › JavaScript

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

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-get-regexp.prototype.sticky

Совместимость с браузерами

Десктопные Мобильные Серверные
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.lastIndex
  • RegExp.prototype.dotAll
  • RegExp.prototype.global
  • RegExp.prototype.hasIndices
  • RegExp.prototype.ignoreCase
  • RegExp.prototype.multiline
  • RegExp.prototype.source
  • RegExp.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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API