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.
Die sticky
Zugriffseigenschaft von RegExp
Instanzen gibt zurück, ob das y
-Flag mit diesem regulären Ausdruck verwendet wird oder nicht.
Probieren Sie es aus
const str1 = "table football";
const regex1 = /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; andernfalls false
. Das y
-Flag zeigt an, dass der reguläre Ausdruck versucht, die Zielzeichenkette nur ab dem durch die lastIndex
Eigenschaft angegebenen Index zu matchen (und im Gegensatz zu einem globalen regulären Ausdruck nicht versucht, ab späteren Indizes zu matchen).
Der Set-Zugriffsfunktionsrichtwert von sticky
ist undefined
. Sie können diese Eigenschaft nicht direkt ändern.
Für sowohl sticky als auch globale reguläre Ausdrücke gilt:
- Sie beginnen das Matchen bei
lastIndex
. - Wenn das Match erfolgreich ist, wird
lastIndex
auf das Ende des Matches vorgesetzt. - Wenn
lastIndex
außerhalb der Grenzen der aktuell gematchten Zeichenkette liegt, wirdlastIndex
auf 0 zurückgesetzt.
Allerdings verhält sich die exec()
-Methode anders, wenn das Matchen fehlschlägt:
- Wenn die
exec()
-Methode auf einen sticky-Regulären Ausdruck aufgerufen wird und der Ausdruck beilastIndex
nicht matcht, gibt der reguläre Ausdruck sofortnull
zurück und setztlastIndex
auf 0 zurück. - Wenn die
exec()
-Methode auf einen globalen regulären Ausdruck aufgerufen wird und der Ausdruck beilastIndex
nicht matcht, versucht sie, ab dem nächsten Zeichen zu matchen und so weiter, bis ein Match gefunden 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 sticky und nicht-globaler regulärer Ausdruck. Da test()
ein einfacher Wrapper um exec()
ist, würde test()
das globale Flag ignorieren und ebenfalls sticky Matches durchführen. Aufgrund vieler anderer Methoden, die das Verhalten globaler regulärer Ausdrücke speziell behandeln, ist das globale Flag im Allgemeinen orthogonal zum sticky-Flag.
String.prototype.matchAll()
(welchesRegExp.prototype[Symbol.matchAll]()
aufruft):y
,g
undgy
sind alle unterschiedlich.- Für
y
-Reguläre Ausdrücke:matchAll()
wirft einen Fehler;[Symbol.matchAll]()
liefert dasexec()
Ergebnis genau einmal, ohne denlastIndex
des regulären Ausdrucks zu aktualisieren. - Für
g
odergy
reguläre Ausdrücke: gibt einen Iterator zurück, der eine Sequenz vonexec()
-Ergebnissen liefert.
- Für
String.prototype.match()
(welchesRegExp.prototype[Symbol.match]()
aufruft):y
,g
undgy
sind alle unterschiedlich.- Für
y
-Reguläre Ausdrücke: gibt dasexec()
-Ergebnis zurück und aktualisiert denlastIndex
des regulären Ausdrucks. - Für
g
odergy
reguläre Ausdrücke: gibt ein Array allerexec()
-Ergebnisse zurück.
- Für
String.prototype.search()
(welchesRegExp.prototype[Symbol.search]()
aufruft): Dasg
-Flag ist immer irrelevant.- Für
y
odergy
reguläre Ausdrücke: gibt immer0
zurück (wenn der sehr Anfang der Zeichenkette matcht) oder-1
(wenn der Anfang nicht matcht), ohne denlastIndex
des regulären Ausdrucks beim Beenden zu aktualisieren. - Für
g
reguläre Ausdrücke: Gibt den Index des ersten Matches in der Zeichenkette zurück oder-1
, wenn kein Match gefunden wird.
- Für
String.prototype.split()
(welchesRegExp.prototype[Symbol.split]()
aufruft):y
,g
undgy
haben alle dasselbe Verhalten.String.prototype.replace()
(welchesRegExp.prototype[Symbol.replace]()
aufruft):y
,g
undgy
sind alle unterschiedlich.- Für
y
-Reguläre Ausdrücke: Ersetzt einmal am aktuellenlastIndex
und aktualisiertlastIndex
. - Für
g
undgy
reguläre Ausdrücke: Ersetzt alle Vorkommen, die vonexec()
gematcht werden.
- Für
String.prototype.replaceAll()
(welchesRegExp.prototype[Symbol.replace]()
aufruft):y
,g
undgy
sind alle unterschiedlich.- Für
y
-Reguläre Ausdrücke:replaceAll()
wirft einen Fehler. - Für
g
undgy
reguläre Ausdrücke: Ersetzt alle Vorkommen, die vonexec()
gematcht werden.
- Für
Beispiele
Verwenden 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
Für mehrere Versionen hatte die SpiderMonkey-Engine von Firefox einen Fehler in Bezug auf die ^
-Assertion und das sticky-Flag, das es Ausdrücken erlaubte, die mit der ^
-Assertion begannen und das sticky-Flag verwendeten, zu matchen, wenn sie es nicht sollten. Der Fehler wurde einige Zeit nach Firefox 3.6 eingeführt (das das sticky-Flag hatte, aber nicht den Fehler) und 2015 behoben. Vielleicht wegen des Fehlers weist die Spezifikation explizit darauf hin, dass:
Auch wenn das
y
-Flag mit einem Muster verwendet wird, matcht^
immer nur am Anfang von Input, oder (wenn rer.[[Multiline]]true
ist) am Anfang einer Zeile.
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® 2026 Language Specification # sec-get-regexp.prototype.sticky |