Start · Sprachen · JavaScript · Referenz · String.prototype.search()

String.prototype.search()

Methode

Sucht mit einem regulären Ausdruck im String und gibt den Index des ersten Treffers zurück, oder <code>-1</code>, wenn nichts gefunden wird.

seit JavaScript ES3 (Baseline: alle Browser) Kategorie: method-property

Signatur

String.prototype.search(regexp)

Beschreibung

search() prüft, ob ein String auf einen regulären Ausdruck passt und an welcher Stelle der erste Treffer beginnt. Die Methode ist das Regex-Gegenstück zu indexOf(): Sie liefert eine Position (nullbasiert) oder -1, aber keine Trefferdetails wie Gruppen oder den gefundenen Text.

Wird kein RegExp-Objekt übergeben, wandelt JavaScript das Argument implizit mit new RegExp(regexp) um. Ein String wie "." wird also als Regex-Metazeichen gedeutet und passt auf jedes Zeichen. Intern ruft search() die Methode RegExp.prototype[Symbol.search] auf.

Nutze search(), wenn du nur die Position des ersten Treffers brauchst. Für eine reine Ja/Nein-Prüfung ist RegExp.prototype.test() klarer. Für den Trefferinhalt oder Gruppen verwendest du match(), matchAll() oder RegExp.prototype.exec().

Das Flag g hat keine Wirkung: search() sucht immer ab dem Anfang des Strings. Der Wert von lastIndex wird ignoriert und nach dem Aufruf wieder auf seinen ursprünglichen Wert gesetzt.

Parameter

Name Typ Default Beschreibung
$regexp Pflicht RegExp|string|any Der reguläre Ausdruck, nach dem gesucht wird. Alles, was kein RegExp ist und keine Methode [Symbol.search] hat, wird mit new RegExp(regexp) umgewandelt. Ohne Argument (undefined) entsteht ein leerer Regex, der auf Index 0 passt.

Beispiele

Position der ersten Ziffer finden

const bestellnummer = "Auftrag ABC-4711";
const pos = bestellnummer.search(/\d/);
console.log(pos);
console.log(bestellnummer.slice(pos));
12 4711

Groß-/Kleinschreibung ignorieren und fehlenden Treffer behandeln

const text = "Willkommen bei programmierung.net";

console.log(text.search(/PROGRAMMIERUNG/i));
console.log(text.search(/python/i));

const hatPython = text.search(/python/i) !== -1;
console.log(hatPython);
15 -1 false

Fallstrick: String-Argument wird zum Regex

const version = "v2.0.1";

// "." ist ein Regex-Metazeichen und passt auf jedes Zeichen
console.log(version.search("."));

// Zum wörtlichen Suchen maskieren oder indexOf verwenden
console.log(version.search(/\./));
console.log(version.indexOf("."));
0 2 2

Eingabe prüfen: Position eines ungültigen Zeichens melden

const pruefeBenutzername = (name) => {
  const pos = name.search(/[^a-z0-9_]/i);
  return pos === -1
    ? "Gültig"
    : `Ungültiges Zeichen "${name[pos]}" an Position ${pos}`;
};

console.log(pruefeBenutzername("max_mustermann"));
console.log(pruefeBenutzername("max muster"));
Gültig Ungültiges Zeichen " " an Position 3

// Wichtig · Fallstricke

  • Strings werden als Regex gedeutet: "a+b".search("+") wirft einen SyntaxError (ungültiger regulärer Ausdruck). Für die wörtliche Suche nach Text ist indexOf() die richtige Wahl. Stammt der Suchtext von Benutzern, musst du ihn vorher maskieren (oder RegExp.escape() nutzen, wo es verfügbar ist).
  • Flag g und lastIndex werden ignoriert: Die Suche beginnt immer bei Index 0. Einen Start-Offset wie bei indexOf(str, from) gibt es nicht. Stattdessen hilft str.slice(from).search(re) plus from oder ein Regex mit Flag y/g zusammen mit exec().
  • Das Ergebnis vergleichen, nicht als Wahrheitswert nutzen: Ein Treffer an Index 0 ist falsy. if (str.search(re)) ist daher ein Fehler. Richtig ist !== -1.
  • Der Index zählt in UTF-16-Codeeinheiten. Emojis und andere Zeichen außerhalb der BMP zählen als zwei Einheiten.
  • search() läuft nur bis zum ersten Treffer. Bei komplexen Mustern und langen Eingaben kann trotzdem katastrophales Backtracking auftreten (ReDoS). Das ist bei Mustern relevant, die aus Benutzereingaben stammen.