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, wird lastIndex 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 sofort null zurück und setzt lastIndex auf 0 zurück, wenn er bei lastIndex 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() (ruft RegExp.prototype[Symbol.matchAll]() auf): y, g und gy sind alle unterschiedlich.
    • Für y-Ausdrücke: matchAll() löst einen Fehler aus; [Symbol.matchAll]() gibt das exec()-Ergebnis genau einmal zurück, ohne den lastIndex des Regulären Ausdrucks zu aktualisieren.
    • Für g- oder gy-Ausdrücke: Gibt einen Iterator zurück, der eine Sequenz von exec()-Ergebnissen liefert.
  • String.prototype.match() (ruft RegExp.prototype[Symbol.match]() auf): y, g und gy sind alle unterschiedlich.
    • Für y-Ausdrücke: Gibt das exec()-Ergebnis zurück und aktualisiert den lastIndex des Regulären Ausdrucks.
    • Für g- oder gy-Ausdrücke: Gibt ein Array aller exec()-Ergebnisse zurück.
  • String.prototype.search() (ruft RegExp.prototype[Symbol.search]() auf): Das g-Flag ist immer irrelevant.
    • Für y- oder gy-Ausdrücke: Gibt immer 0 zurück (wenn der Anfang der Zeichenkette übereinstimmt) oder -1 (wenn der Anfang nicht übereinstimmt), ohne den lastIndex 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.
  • String.prototype.split() (ruft RegExp.prototype[Symbol.split]() auf): y, g und gy haben das gleiche Verhalten.
  • String.prototype.replace() (ruft RegExp.prototype[Symbol.replace]() auf): y, g und gy sind alle unterschiedlich.
    • Für y-Ausdrücke: Ersetzt einmal an der aktuellen Position von lastIndex und aktualisiert lastIndex.
    • Für g- und gy-Ausdrücke: Ersetzt alle Übereinstimmungen, die von exec() gefunden werden.
  • String.prototype.replaceAll() (ruft RegExp.prototype[Symbol.replace]() auf): y, g und gy sind alle unterschiedlich.
    • Für y-Ausdrücke: replaceAll() löst einen Fehler aus.
    • Für g- und gy-Ausdrücke: Ersetzt alle Übereinstimmungen, die von exec() gefunden werden.

Beispiele

Verwendung eines regulären Ausdrucks mit dem sticky-Flag

js
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:

js
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 GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
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

Siehe auch