RegExp.prototype.sticky
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit September 2016 browserübergreifend verfügbar.
Die Accessor-Eigenschaft sticky von RegExp-Instanzen gibt an, ob für diesen regulären Ausdruck das Flag y verwendet wird.
Probieren Sie es aus
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
Beschreibung
RegExp.prototype.sticky hat den Wert true, wenn das Flag y verwendet wurde; andernfalls hat die Eigenschaft den Wert false. Das Flag y bewirkt, dass der reguläre Ausdruck nur an dem Index im Zielstring nach einer Übereinstimmung sucht, den die Eigenschaft lastIndex angibt. Anders als ein globaler regulärer Ausdruck versucht er nicht, an späteren Indizes eine Übereinstimmung zu finden.
Der Set-Accessor von sticky ist undefined. Sie können diese Eigenschaft nicht direkt ändern.
Sowohl für reguläre Ausdrücke mit dem Sticky-Flag als auch für globale reguläre Ausdrücke gilt:
- Die Suche nach einer Übereinstimmung beginnt bei
lastIndex. - Bei einer erfolgreichen Übereinstimmung wird
lastIndexauf das Ende der Übereinstimmung gesetzt. - Wenn
lastIndexaußerhalb der Grenzen des Strings liegt, in dem gerade gesucht wird, wirdlastIndexauf 0 zurückgesetzt.
Bei der Methode exec() unterscheiden sie sich jedoch darin, was bei einer fehlgeschlagenen Suche geschieht:
- Wird die Methode
exec()für einen regulären Ausdruck mit dem Sticky-Flag aufgerufen und findet dieser beilastIndexkeine Übereinstimmung, gibt sie sofortnullzurück und setztlastIndexauf 0 zurück. - Wird die Methode
exec()für einen globalen regulären Ausdruck aufgerufen und findet dieser beilastIndexkeine Übereinstimmung, sucht sie ab dem nächsten Zeichen weiter. Dies wird wiederholt, bis eine Übereinstimmung gefunden oder das Ende des Strings erreicht wird.
Bei der Methode exec() verhält sich ein regulärer Ausdruck mit sowohl dem Sticky- als auch dem Global-Flag genauso wie einer mit dem Sticky-Flag, aber ohne das Global-Flag. Da test() lediglich exec() aufruft, ignoriert auch test() das Global-Flag und sucht nach Übereinstimmungen gemäß dem Sticky-Flag. Da viele andere Methoden globale reguläre Ausdrücke jedoch gesondert behandeln, ist das Global-Flag im Allgemeinen unabhängig vom Sticky-Flag.
String.prototype.matchAll()(ruftRegExp.prototype[Symbol.matchAll]()auf):y,gundgyverhalten sich jeweils unterschiedlich.- Bei regulären Ausdrücken mit
y:matchAll()löst eine Ausnahme aus;[Symbol.matchAll]()liefert das Ergebnis vonexec()genau einmal, ohnelastIndexdes regulären Ausdrucks zu aktualisieren. - Bei regulären Ausdrücken mit
godergy: Gibt einen Iterator zurück, der eine Folge vonexec()-Ergebnissen liefert.
- Bei regulären Ausdrücken mit
String.prototype.match()(ruftRegExp.prototype[Symbol.match]()auf):y,gundgyverhalten sich jeweils unterschiedlich.- Bei regulären Ausdrücken mit
y: Gibt das Ergebnis vonexec()zurück und aktualisiertlastIndexdes regulären Ausdrucks. - Bei regulären Ausdrücken mit
godergy: Gibt ein Array mit allenexec()-Ergebnissen zurück.
- Bei regulären Ausdrücken mit
String.prototype.search()(ruftRegExp.prototype[Symbol.search]()auf): Das Flaggist stets irrelevant.- Bei regulären Ausdrücken mit
yodergy: Gibt immer0zurück, wenn der Anfang des Strings übereinstimmt, andernfalls-1.lastIndexdes regulären Ausdrucks wird beim Beenden nicht aktualisiert. - Bei regulären Ausdrücken mit
g: Gibt den Index der ersten Übereinstimmung im String zurück oder-1, wenn keine Übereinstimmung gefunden wird.
- Bei regulären Ausdrücken mit
String.prototype.split()(ruftRegExp.prototype[Symbol.split]()auf):y,gundgyverhalten sich gleich.String.prototype.replace()(ruftRegExp.prototype[Symbol.replace]()auf):y,gundgyverhalten sich jeweils unterschiedlich.- Bei regulären Ausdrücken mit
y: Ersetzt einmal an der aktuellen Position vonlastIndexund aktualisiertlastIndex. - Bei regulären Ausdrücken mit
godergy: Ersetzt alle durchexec()gefundenen Übereinstimmungen.
- Bei regulären Ausdrücken mit
String.prototype.replaceAll()(ruftRegExp.prototype[Symbol.replace]()auf):y,gundgyverhalten sich jeweils unterschiedlich.- Bei regulären Ausdrücken mit
y:replaceAll()löst eine Ausnahme aus. - Bei regulären Ausdrücken mit
godergy: Ersetzt alle durchexec()gefundenen Übereinstimmungen.
- Bei regulären Ausdrücken mit
Beispiele
>Einen regulären Ausdruck mit dem Sticky-Flag verwenden
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)
Sticky-Flag mit Anfangsanker
Über mehrere Versionen hinweg hatte die SpiderMonkey-Engine von Firefox einen Fehler im Zusammenhang mit der Assertion ^ und dem Sticky-Flag. Dadurch konnten Ausdrücke, die mit der Assertion ^ begannen und das Sticky-Flag verwendeten, Übereinstimmungen finden, obwohl sie das nicht hätten tun dürfen. Der Fehler wurde irgendwann nach Firefox 3.6 eingeführt (das Sticky-Flag war dort bereits vorhanden, der Fehler jedoch nicht) und 2015 behoben. Möglicherweise wegen dieses Fehlers weist die Spezifikation ausdrücklich darauf hin, dass:
Selbst wenn das Flag
ymit einem Muster verwendet wird, findet^nur am Anfang von Input eine Übereinstimmung oder (wenn rer.[[Multiline]] den Werttruehat) am Anfang einer Zeile.
Beispiele für das korrekte Verhalten:
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
Spezifikationen
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # sec-get-regexp.prototype.sticky> |