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 July 2015.
Die sticky
Accessor-Eigenschaft von RegExp
-Instanzen gibt zurück, ob das y
-Flag mit diesem regulären Ausdruck verwendet wird.
Probieren Sie es aus
const str1 = "table football";
const regex1 = new RegExp("foo", "y");
regex1.lastIndex = 6;
console.log(regex1.sticky);
// Expected output: true
console.log(regex1.test(str1));
// Expected output: true
console.log(regex1.test(str1));
// Expected output: false
Beschreibung
RegExp.prototype.sticky
hat den Wert true
, wenn das y
-Flag verwendet wurde; ansonsten false
. Das y
-Flag zeigt an, dass der reguläre Ausdruck nur ab dem Index übereinstimmen soll, der durch die lastIndex
-Eigenschaft angegeben wird (und im Gegensatz zu einem globalen regulären Ausdruck nicht versucht, ab späteren Indizes zu übereinstimmen).
Der Set-Accessor von sticky
ist undefined
. Sie können diese Eigenschaft nicht direkt ändern.
Sowohl für sticky als auch für globale reguläre Ausdrücke gilt:
- Sie beginnen mit dem Abgleich bei
lastIndex
. - Wenn die Übereinstimmung erfolgreich ist, wird
lastIndex
bis zum Ende der Übereinstimmung vorgerückt. - Wenn
lastIndex
außerhalb der Grenzen der aktuell abgeglichenen Zeichenkette liegt, wirdlastIndex
auf 0 zurückgesetzt.
Für die exec()
-Methode ist das Verhalten bei fehlgeschlagener Übereinstimmung jedoch unterschiedlich:
- Wenn die
exec()
-Methode auf einen sticky regulären Ausdruck angewendet wird, gibt der reguläre Ausdruck sofortnull
zurück und setztlastIndex
auf 0 zurück, wenn er beilastIndex
nicht übereinstimmt. - Wenn die
exec()
-Methode auf einen globalen regulären Ausdruck angewendet wird, versucht der reguläre Ausdruck, ab dem nächsten Zeichen und so weiter zu übereinstimmen, bis eine Übereinstimmung gefunden wird oder das Ende der Zeichenkette erreicht ist.
Für die exec()
-Methode verhält sich ein regulärer Ausdruck, der sowohl sticky als auch global ist, genauso wie ein nicht-globaler sticky Regulärer Ausdruck. Da test()
ein einfacher Wrapper um exec()
ist, ignoriert test()
das globale Flag und führt ebenfalls sticky Abstimmungen durch. Aufgrund vieler anderer Methoden, die das Verhalten globaler regulärer Ausdrücke speziell behandeln, ist das globale Flag im Allgemeinen unabhängig vom sticky Flag.
String.prototype.matchAll()
(ruftRegExp.prototype[Symbol.matchAll]()
auf):y
,g
undgy
sind alle unterschiedlich.- Für
y
-Ausdrücke:matchAll()
löst einen Fehler aus;[Symbol.matchAll]()
gibt dasexec()
-Ergebnis genau einmal zurück, ohne denlastIndex
des Regulären Ausdrucks zu aktualisieren. - Für
g
- odergy
-Ausdrücke: Gibt einen Iterator zurück, der eine Sequenz vonexec()
-Ergebnissen liefert.
- Für
String.prototype.match()
(ruftRegExp.prototype[Symbol.match]()
auf):y
,g
undgy
sind alle unterschiedlich.- Für
y
-Ausdrücke: Gibt dasexec()
-Ergebnis zurück und aktualisiert denlastIndex
des Regulären Ausdrucks. - Für
g
- odergy
-Ausdrücke: Gibt ein Array allerexec()
-Ergebnisse zurück.
- Für
String.prototype.search()
(ruftRegExp.prototype[Symbol.search]()
auf): Dasg
-Flag ist immer irrelevant.- Für
y
- odergy
-Ausdrücke: Gibt immer0
zurück (wenn der Anfang der Zeichenkette übereinstimmt) oder-1
(wenn der Anfang nicht übereinstimmt), ohne denlastIndex
des Regulären Ausdrucks zu aktualisieren, wenn es beendet wird. - Für
g
-Ausdrücke: Gibt den Index der ersten Übereinstimmung in der Zeichenkette zurück oder-1
, wenn keine Übereinstimmung gefunden wird.
- Für
String.prototype.split()
(ruftRegExp.prototype[Symbol.split]()
auf):y
,g
undgy
haben das gleiche Verhalten.String.prototype.replace()
(ruftRegExp.prototype[Symbol.replace]()
auf):y
,g
undgy
sind alle unterschiedlich.- Für
y
-Ausdrücke: Ersetzt einmal an der aktuellen Position vonlastIndex
und aktualisiertlastIndex
. - Für
g
- undgy
-Ausdrücke: Ersetzt alle Übereinstimmungen, die vonexec()
gefunden werden.
- Für
String.prototype.replaceAll()
(ruftRegExp.prototype[Symbol.replace]()
auf):y
,g
undgy
sind alle unterschiedlich.- Für
y
-Ausdrücke:replaceAll()
löst einen Fehler aus. - Für
g
- undgy
-Ausdrücke: Ersetzt alle Übereinstimmungen, die vonexec()
gefunden werden.
- Für
Beispiele
Verwendung eines regulären Ausdrucks mit dem sticky-Flag
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)
Verankertes sticky-Flag
In mehreren Versionen hatte die SpiderMonkey-Engine von Firefox einen Bug in Bezug auf die ^
-Assertion und das sticky-Flag, der es Ausdrücken mit beginnender ^
-Assertion und sticky-Flag erlaubte, übereinzustimmen, wenn sie es eigentlich nicht sollten. Der Fehler wurde irgendwann nach Firefox 3.6 eingeführt (das das sticky-Flag hatte, aber nicht den Bug) und 2015 behoben. Möglicherweise wegen dieses Fehlers hebt die Spezifikation explizit hervor, dass:
Auch wenn das
y
-Flag mit einem Muster verwendet wird, stimmt^
immer nur am Anfang von Input oder (wenn rer.[[Multiline]]true
ist) am Anfang einer Zeile überein.
Beispiele für korrektes Verhalten:
const regex = /^foo/y;
regex.lastIndex = 2;
regex.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
Spezifikationen
Specification |
---|
ECMAScript® 2025 Language Specification # sec-get-regexp.prototype.sticky |
Browser-Kompatibilität
Report problems with this compatibility data on GitHubdesktop | mobile | server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
sticky | ||||||||||||||
Anchored sticky flag behavior per ES2015 | ||||||||||||||
Prototype accessor property (ES2015) |
Legend
Tip: you can click/tap on a cell for more information.
- Full support
- Full support