Start · Sprachen · JavaScript · Referenz · Eingabebegrenzungs-Assertion: ^, $

Eingabebegrenzungs-Assertion: ^, $

Keyword

Die Zeichen <code>^</code> und <code>$</code> prüfen, ob die aktuelle Position am Anfang bzw. am Ende der Eingabe liegt. Mit dem Flag <code>m</code> prüfen sie stattdessen auf Zeilengrenzen.

seit JavaScript ES3 (Flag m: ES3, Flag v: ES2024) — Baseline: alle Kategorie: syntax

Signatur

/^muster$/ — ^ (Eingabeanfang), $ (Eingabeende)

Beschreibung

Eine Eingabebegrenzungs-Assertion ist eine Zusicherung mit der Breite null: Sie verbraucht kein Zeichen und prüft nur, ob die aktuelle Position im String eine Grenze ist. ^ passt am Anfang der Eingabe, $ am Ende. Beide werden vor allem zum Verankern eines Musters verwendet. So lässt sich sicherstellen, dass der gesamte String einem Format entspricht und nicht nur ein Teil davon, etwa bei der Prüfung von Postleitzahlen, IDs oder Hex-Farben.

Ist das Flag m (multiline) gesetzt, ändert sich die Bedeutung: ^ passt dann zusätzlich direkt nach jedem Zeilenumbruch, $ direkt vor jedem Zeilenumbruch. Als Zeilenumbruch gelten \n, \r, \u2028 und \u2029. Damit kann man Text zeilenweise durchsuchen, zum Beispiel Konfigurationsdateien, Logs oder Markdown.

Wichtig: ^ hat nur am Anfang eines Musters oder einer Alternative diese Bedeutung. Innerhalb einer Zeichenklasse direkt nach [ bedeutet es dagegen Negation ([^0-9]). Wer ein wörtliches ^ oder $ finden will, muss es mit \^ bzw. \$ maskieren.

Parameter

Name Typ Default Beschreibung
$^ Assertion Passt am Anfang der Eingabe. Mit Flag m passt es zusätzlich nach jedem Zeilenumbruch.
$$ Assertion Passt am Ende der Eingabe. Mit Flag m passt es zusätzlich vor jedem Zeilenumbruch.
$m Flag nicht gesetzt Multiline-Flag. Macht aus den Eingabegrenzen Zeilengrenzen.

Rückgabewert

Typ
Assertion (Breite null)
Beschreibung
Verbraucht keine Zeichen. Die Übereinstimmung gelingt nur, wenn die Position eine passende Grenze ist.

Beispiele

Ganzen String validieren (Postleitzahl)

const plz = /^\d{5}$/;

console.log(plz.test('10115'));      // genau 5 Ziffern
console.log(plz.test('PLZ 10115'));  // Präfix, daher kein Treffer
console.log(/\d{5}/.test('PLZ 10115')); // ohne Anker: Teiltreffer
true false true

Zeilenweise suchen mit Flag m

const log = `INFO Start
ERROR Datenbank nicht erreichbar
INFO Retry
ERROR Timeout`;

const fehler = log.match(/^ERROR .*$/gm);
console.log(fehler);

// Ohne m passt ^ nur am Anfang des gesamten Strings
console.log(log.match(/^ERROR .*$/g));
[ 'ERROR Datenbank nicht erreichbar', 'ERROR Timeout' ] null

Führende und abschließende Leerzeichen entfernen

const eingabe = '   Hallo Welt   ';
const bereinigt = eingabe.replace(/^\s+|\s+$/g, '');
console.log(`[${bereinigt}]`);
[Hallo Welt]

Zeilen einrücken (Präfix je Zeile)

const code = 'const a = 1;\nconst b = 2;';
const eingerueckt = code.replace(/^/gm, '  ');
console.log(eingerueckt);
const a = 1; const b = 2;

// Wichtig · Fallstricke

  • Vorrang bei Alternativen: /^a|b$/ bedeutet „a am Anfang ODER b am Ende“. Sollen beide Anker für alle Alternativen gelten, braucht man eine Gruppe: /^(?:a|b)$/. Das ist ein häufiger Validierungsfehler.
  • $ und abschließender Zeilenumbruch: Anders als in Perl, PCRE oder Python passt $ in JavaScript ohne Flag m nicht vor einem abschließenden \n. Deshalb liefert /^abc$/.test('abc\n') den Wert false. Die Anker \A, \Z und \z gibt es in JavaScript nicht.
  • Windows-Zeilenenden: Da auch \r als Zeilenumbruch zählt, entsteht mit Flag m bei \r\n eine leere „Zeile“ zwischen \r und \n. Das kann bei /^$/gm zusätzliche Treffer erzeugen.
  • Mit Flag y (sticky): ^ passt ohne Flag m weiterhin nur am Anfang der Eingabe, nicht an der Position lastIndex.
  • Sicherheit und Leistung: Bei der Validierung von Benutzereingaben sollte man immer beide Anker setzen, sonst werden Eingaben wie '<script>12345' akzeptiert. Verankerte Muster scheitern außerdem schneller und verringern die Gefahr von ReDoS.
  • Innerhalb von [...] ist ^ ein Negationszeichen und $ ein normales Zeichen.