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, wird lastIndex 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 bei lastIndex nicht schafft, gibt der Regex sofort null zurück und setzt lastIndex auf 0 zurück.
  • Wenn die exec()-Methode bei einem globalen Regex aufgerufen wird und der Regex den Abgleich bei lastIndex 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.

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

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:

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 Language Specification
# sec-get-regexp.prototype.sticky

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch