Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. JavaScript
  3. JavaScript-Referenz
  4. Eingebaute Standardobjekte
  5. RegExp
  6. lastIndex

Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.

View in EnglishAlways switch to English

RegExp: lastIndex

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨Juli 2015⁩.

DielastIndex Dateneigenschaft einerRegExp-Instanz gibt den Index an, an dem die nächste Übereinstimmung beginnen soll.

Probieren Sie es aus

const regex = /foo/g;const str = "table football, foosball";regex.test(str);console.log(regex.lastIndex);// Expected output: 9regex.test(str);console.log(regex.lastIndex);// Expected output: 19

Wert

Eine nicht-negative Ganzzahl.

Eigenschaften vonRegExp: lastIndex
Schreibbarja
Aufzählbarnein
Konfigurierbarnein

Beschreibung

Diese Eigenschaft wird nur gesetzt, wenn die RegExp-Instanz dasg-Flag für eine globale Suche oder dasy-Flag für eine klebrige Suche verwendet hat. Folgende Regeln gelten, wennexec() auf einer bestimmten Eingabe aufgerufen wird:

  • WennlastIndex größer als die Länge der Eingabe ist, wirdexec() keine Übereinstimmung finden, undlastIndex wird auf 0 gesetzt.
  • WennlastIndex gleich oder kleiner als die Länge der Eingabe ist, wirdexec() versuchen, die Eingabe ablastIndex zu matchen.
    • Wennexec() eine Übereinstimmung findet, wirdlastIndex auf die Position des Endes des übereinstimmenden Strings in der Eingabe gesetzt.
    • Wennexec() keine Übereinstimmung findet, wirdlastIndex auf 0 gesetzt.

Andere regex-bezogene Methoden wieRegExp.prototype.test(),String.prototype.match(),String.prototype.replace() usw. rufenexec() im Hintergrund auf und haben daher unterschiedliche Auswirkungen auflastIndex. Siehe die entsprechenden Seiten für Details.

Beispiele

Verwendung von lastIndex

Betrachten Sie die folgende Befehlsequenz:

js
const re = /(hi)?/g;

Übereinstimmungen mit dem leeren String.

js
console.log(re.exec("hi"));console.log(re.lastIndex);

Gibt["hi", "hi"] zurück, mitlastIndex gleich 2.

js
console.log(re.exec("hi"));console.log(re.lastIndex);

Gibt["", undefined] zurück, ein leeres Array, dessen nulltes Element der übereinstimmende String ist. In diesem Fall der leere String, dalastIndex 2 war (und immer noch 2 ist) undhi eine Länge von 2 hat.

Verwendung von lastIndex mit sticky Regexen

DielastIndex Eigenschaft ist beschreibbar. Sie können sie setzen, damit der Regex die nächste Suche an einem bestimmten Index beginnt.

Dasy-Flag erfordert fast immer das Setzen vonlastIndex. Es matcht immer genau beilastIndex und versucht keine späteren Positionen. Dies ist normalerweise nützlich für das Schreiben von Parsern, wenn Sie Token nur an der aktuellen Position matchen möchten.

js
const stringPattern = /"[^"]*"/y;const input = `const message = "Hello world";`;stringPattern.lastIndex = 6;console.log(stringPattern.exec(input)); // nullstringPattern.lastIndex = 16;console.log(stringPattern.exec(input)); // ['"Hello world"']

Zurücksetzen von lastIndex

Dasg-Flag profitiert ebenfalls vom Setzen vonlastIndex. Ein häufiger Anwendungsfall ist, wenn der String während einer globalen Suche in der Mitte modifiziert wird. In diesem Fall könnten wir ein bestimmtes Match verpassen, wenn der String verkürzt wird. Wir können dies vermeiden, indem wirlastIndex zurückspulen.

js
const mdLinkPattern = /\[[^[\]]+\]\((?<link>[^()\s]+)\)/dg;function resolveMDLink(line) {  let match;  let modifiedLine = line;  while ((match = mdLinkPattern.exec(modifiedLine))) {    const originalLink = match.groups.link;    const resolvedLink = originalLink.replaceAll(/^files|\/index\.md$/g, "");    modifiedLine =      modifiedLine.slice(0, match.indices.groups.link[0]) +      resolvedLink +      modifiedLine.slice(match.indices.groups.link[1]);    // Rewind the pattern to the end of the resolved link    mdLinkPattern.lastIndex += resolvedLink.length - originalLink.length;  }  return modifiedLine;}console.log(  resolveMDLink(    "[`lastIndex`](files/en-us/web/javascript/reference/global_objects/regexp/lastindex/index.md)",  ),); // [`lastIndex`](/en-us/web/javascript/reference/global_objects/regexp/lastindex)console.log(  resolveMDLink(    "[`ServiceWorker`](files/en-us/web/api/serviceworker/index.md) and [`SharedWorker`](files/en-us/web/api/sharedworker/index.md)",  ),); // [`ServiceWorker`](/en-us/web/api/serviceworker) and [`SharedWorker`](/en-us/web/api/sharedworker)

Versuchen Sie, die ZeilemdLinkPattern.lastIndex += resolvedLink.length - originalLink.length zu löschen und das zweite Beispiel auszuführen. Sie werden feststellen, dass der zweite Link nicht korrekt ersetzt wird, dalastIndex nach der Verkürzung des Strings bereits über den Index des Links hinausgeht.

Warnung:Dieses Beispiel dient nur zur Veranschaulichung. Um mit Markdown umzugehen, sollten Sie wahrscheinlich eine Parsing-Bibliothek anstelle von Regex verwenden.

Suche optimieren

Sie können die Suche optimieren, indem SielastIndex an einen Punkt setzen, an dem frühere mögliche Vorkommen ignoriert werden können. Zum Beispiel, anstatt dies zu tun:

js
const stringPattern = /"[^"]*"/g;const input = `const message = "Hello " + "world";`;// Pretend we've already dealt with the previous parts of the stringlet offset = 26;const remainingInput = input.slice(offset);const nextString = stringPattern.exec(remainingInput);console.log(nextString[0]); // "world"offset += nextString.index + nextString.length;

Betrachten Sie dies:

js
stringPattern.lastIndex = offset;const nextString = stringPattern.exec(remainingInput);console.log(nextString[0]); // "world"offset = stringPattern.lastIndex;

Dies ist potenziell leistungsfähiger, da wir das Zerteilen des Strings vermeiden.

Nebeneffekte vermeiden

Die Nebeneffekte, die durchexec() verursacht werden, können verwirrend sein, besonders wenn die Eingabe für jedesexec() unterschiedlich ist.

js
const re = /foo/g;console.log(re.test("foo bar")); // trueconsole.log(re.test("foo baz")); // false, because lastIndex is non-zero

Dies ist noch verwirrender, wenn SielastIndex von Hand modifizieren. Um die Nebeneffekte einzudämmen, denken Sie daran,lastIndex nach jeder vollständig verarbeiteten Eingabe zurückzusetzen.

js
const re = /foo/g;console.log(re.test("foo bar")); // truere.lastIndex = 0;console.log(re.test("foo baz")); // true

Mit etwas Abstraktion können Sie erfordern, dasslastIndex vor jedemexec()-Aufruf auf einen bestimmten Wert gesetzt wird.

js
function createMatcher(pattern) {  // Create a copy, so that the original regex is never updated  const regex = new RegExp(pattern, "g");  return (input, offset) => {    regex.lastIndex = offset;    return regex.exec(input);  };}const matchFoo = createMatcher(/foo/);console.log(matchFoo("foo bar", 0)[0]); // "foo"console.log(matchFoo("foo baz", 0)[0]); // "foo"

Spezifikationen

Specification
ECMAScript® 2026 Language Specification
# sec-properties-of-regexp-instances

Browser-Kompatibilität

Siehe auch

Help improve MDN

Learn how to contribute Diese Seite wurde automatisch aus dem Englischen übersetzt.

[8]ページ先頭

©2009-2025 Movatter.jp