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
Zugriffseigenschaft von RegExp
-Instanzen gibt an, ob das y
-Flag mit diesem regulären Ausdruck verwendet wird oder nicht.
Probieren Sie es aus
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 Zielzeichenfolge nur ab dem Index abzugleichen, der durch die lastIndex
-Eigenschaft angegeben wird (und im Gegensatz zu einem globalen Regex, versucht nicht, von späteren Indizes abzugleichen).
Der Set-Zugriff von sticky
ist undefined
. Sie können diese Eigenschaft nicht direkt ändern.
Für sowohl sticky Regex als auch globale Regex:
- Sie beginnen mit dem Abgleich bei
lastIndex
. - Wenn der Abgleich erfolgreich ist, wird
lastIndex
auf das Ende des Abgleichs verschoben. - Wenn
lastIndex
außerhalb der Grenzen der derzeit abgeglichenen Zeichenfolge liegt, wirdlastIndex
auf 0 zurückgesetzt.
Beim exec()
-Methode ist das Verhalten bei einem fehlschlagenden Abgleich unterschiedlich:
- Wenn die
exec()
-Methode bei einem sticky Regex aufgerufen wird und der Regex den Abgleich beilastIndex
nicht schafft, gibt der Regex sofortnull
zurück und setztlastIndex
auf 0 zurück. - Wenn die
exec()
-Methode bei einem globalen Regex aufgerufen wird und der Regex den Abgleich beilastIndex
nicht schafft, versucht es, ab dem nächsten Zeichen abzugleichen, und so weiter, bis ein Abgleich gefunden wird oder das Ende der Zeichenfolge erreicht ist.
Für die exec()
-Methode verhält sich ein Regex, das sowohl sticky als auch global ist, wie ein sticky und nicht-globales Regex. Da test()
ein einfacher Wrapper um exec()
ist, würde test()
das globale Flag ignorieren und ebenfalls sticky-Abgleiche durchführen. Aufgrund vieler anderer Methoden, die das Verhalten von globalen Regexen speziell behandeln, ist das globale Flag im Allgemeinen orthogonal zum sticky Flag.
String.prototype.matchAll()
(ruftRegExp.prototype[Symbol.matchAll]()
auf):y
,g
undgy
sind alle unterschiedlich.- Für
y
Regex:matchAll()
wirft einen Fehler;[Symbol.matchAll]()
gibt dasexec()
-Ergebnis genau einmal zurück, ohne denlastIndex
des Regex zu aktualisieren. - Für
g
odergy
Regex: 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
Regex: Gibt dasexec()
-Ergebnis zurück und aktualisiert denlastIndex
des Regex. - Für
g
odergy
Regex: 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
Regex: Gibt immer0
zurück (wenn der Anfang der Zeichenfolge übereinstimmt) oder-1
(wenn der Anfang nicht übereinstimmt), ohne denlastIndex
des Regex bei Beendigung zu aktualisieren. - Für
g
Regex: Gibt den Index der ersten Übereinstimmung in der Zeichenfolge zurück oder-1
, wenn keine Übereinstimmung gefunden wird.
- Für
String.prototype.split()
(ruftRegExp.prototype[Symbol.split]()
auf):y
,g
undgy
verhalten sich gleich.String.prototype.replace()
(ruftRegExp.prototype[Symbol.replace]()
auf):y
,g
undgy
sind alle unterschiedlich.- Für
y
Regex: Ersetzt einmal am aktuellenlastIndex
und aktualisiertlastIndex
. - Für
g
undgy
Regex: Ersetzt alle Vorkommen, die vonexec()
abgeglichen werden.
- Für
String.prototype.replaceAll()
(ruftRegExp.prototype[Symbol.replace]()
auf):y
,g
undgy
sind alle unterschiedlich.- Für
y
Regex:replaceAll()
wirft einen Fehler. - Für
g
undgy
Regex: Ersetzt alle Vorkommen, die vonexec()
abgeglichen 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
Für mehrere Versionen hatte die SpiderMonkey-Engine von Firefox einen Fehler in Bezug auf die ^
-Assertion und das sticky-Flag, der es Ausdrücken, die mit der ^
-Assertion beginnen und das sticky-Flag verwenden, erlaubte, Übereinstimmungen zu finden, wenn sie es nicht sollten. Der Fehler wurde irgendwann nach Firefox 3.6 eingeführt (welches das sticky-Flag hatte, aber nicht den Fehler) und 2015 behoben. Vielleicht wegen des Fehlers ruft die Spezifikation explizit den Fakt auf:
Auch wenn das
y
-Flag mit einem Muster verwendet wird, passt^
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 Language Specification # sec-get-regexp.prototype.sticky |
Browser-Kompatibilität
BCD tables only load in the browser