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

View in English Always switch to English

Assertions

Assertions umfassen Grenzen, die den Anfang und das Ende von Zeilen und Wörtern kennzeichnen, sowie andere Muster, die auf bestimmte Weise angeben, ob eine Übereinstimmung möglich ist. Dazu gehören Lookahead-, Lookbehind- und bedingte Ausdrücke.

Probieren Sie es aus

const text = "A quick fox";

const regexpLastWord = /\w+$/;
console.log(text.match(regexpLastWord));
// Expected output: Array ["fox"]

const regexpWords = /\b\w+\b/g;
console.log(text.match(regexpWords));
// Expected output: Array ["A", "quick", "fox"]

const regexpFoxQuality = /\w+(?= fox)/;
console.log(text.match(regexpFoxQuality));
// Expected output: Array ["quick"]

Typen

Assertions für Grenzen

Zeichen Bedeutung
^

Assertion für den Anfang der Eingabe: Entspricht dem Anfang der Eingabe. Wenn das Flag multiline (m) aktiviert ist, entspricht es auch der Position unmittelbar nach einem Zeilenumbruchzeichen. Beispielsweise entspricht /^A/ nicht dem „A“ in „an A“, aber dem ersten „A“ in „An A“.

Hinweis: Dieses Zeichen hat eine andere Bedeutung, wenn es am Anfang einer Zeichenklasse steht.

$

Assertion für das Ende der Eingabe: Entspricht dem Ende der Eingabe. Wenn das Flag multiline (m) aktiviert ist, entspricht es auch der Position unmittelbar vor einem Zeilenumbruchzeichen. Beispielsweise entspricht /t$/ nicht dem „t“ in „eater“, aber dem „t“ in „eat“.

\A

Assertion für den Anfang des Buffers: Entspricht dem Anfang der gesamten Zeichenfolge, unabhängig davon, ob das Flag m gesetzt ist. Nur im Unicode-bewussten Modus gültig.

\z

Assertion für das Ende des Buffers: Entspricht dem Ende der gesamten Zeichenfolge, unabhängig davon, ob das Flag m gesetzt ist. Nur im Unicode-bewussten Modus gültig.

\Z

Assertion für das Ende des Buffers mit optionalem Zeilenumbruch: Entspricht dem Ende der gesamten Zeichenfolge, erlaubt aber eine optionale abschließende Zeilenumbruchsequenz (entweder ein Zeilenabschlusszeichen oder eine \r\n-Sequenz). Nur im Unicode-bewussten Modus gültig.

\b

Assertion für eine Wortgrenze: Entspricht einer Wortgrenze. Das ist eine Position, an der vor oder nach einem Wortzeichen kein weiteres Wortzeichen steht, beispielsweise zwischen einem Buchstaben und einem Leerzeichen. Beachten Sie, dass die gefundene Wortgrenze nicht Teil der Übereinstimmung ist. Mit anderen Worten: Die Länge einer gefundenen Wortgrenze beträgt null.

Beispiele:

  • /\bm/ entspricht dem „m“ in „moon“.
  • /oo\b/ entspricht nicht dem „oo“ in „moon“, weil auf „oo“ mit „n“ ein Wortzeichen folgt.
  • /oon\b/ entspricht dem „oon“ in „moon“, weil „oon“ am Ende der Zeichenfolge steht und somit kein Wortzeichen darauf folgt.
  • /\w\b\w/ findet niemals eine Übereinstimmung, da auf ein Wortzeichen nicht zugleich ein Nicht-Wortzeichen und ein Wortzeichen folgen können.

Wie Sie ein Rückschrittzeichen ([\b]) finden, erfahren Sie unter Zeichenklassen.

\B

Assertion für eine Nicht-Wortgrenze: Entspricht einer Position, die keine Wortgrenze ist. An dieser Position sind das vorherige und das nächste Zeichen vom gleichen Typ: Entweder sind beide Wortzeichen oder beide Nicht-Wortzeichen, beispielsweise zwischen zwei Buchstaben oder zwischen zwei Leerzeichen. Anfang und Ende einer Zeichenfolge gelten als Nicht-Wortzeichen. Wie eine gefundene Wortgrenze ist auch eine gefundene Nicht-Wortgrenze nicht Teil der Übereinstimmung. Beispielsweise entspricht /\Bon/ dem „on“ in „at noon“ und /ye\B/ dem „ye“ in „possibly yesterday“.

Andere Assertions

Hinweis: Das Zeichen ? kann auch als Quantifizierer verwendet werden.

Zeichen Bedeutung
x(?=y)

Lookahead-Assertion: Entspricht „x“ nur, wenn darauf „y“ folgt. Beispielsweise entspricht /Jack(?=Sprat)/ „Jack“ nur, wenn darauf „Sprat“ folgt.
/Jack(?=Sprat|Frost)/ entspricht „Jack“ nur, wenn darauf „Sprat“ oder „Frost“ folgt. Weder „Sprat“ noch „Frost“ ist jedoch Teil des Übereinstimmungsergebnisses.

x(?!y)

Negative Lookahead-Assertion: Entspricht „x“ nur, wenn darauf nicht „y“ folgt. Beispielsweise entspricht /\d+(?!\.)/ einer Zahl nur, wenn darauf kein Dezimalpunkt folgt. /\d+(?!\.)/.exec('3.141') entspricht „141“, aber nicht „3“.

(?<=y)x

Lookbehind-Assertion: Entspricht „x“ nur, wenn davor „y“ steht. Beispielsweise entspricht /(?<=Jack)Sprat/ „Sprat“ nur, wenn davor „Jack“ steht. /(?<=Jack|Tom)Sprat/ entspricht „Sprat“ nur, wenn davor „Jack“ oder „Tom“ steht. Weder „Jack“ noch „Tom“ ist jedoch Teil des Übereinstimmungsergebnisses.

(?<!y)x

Negative Lookbehind-Assertion: Entspricht „x“ nur, wenn davor nicht „y“ steht. Beispielsweise entspricht /(?<!-)\d+/ einer Zahl nur, wenn davor kein Minuszeichen steht. /(?<!-)\d+/.exec('3') entspricht „3“. Bei /(?<!-)\d+/.exec('-3') wird keine Übereinstimmung gefunden, da vor der Zahl ein Minuszeichen steht.

Beispiele

Allgemeines Beispiel für Assertions für Grenzen

js
// Using Regex boundaries to fix buggy string.
buggyMultiline = `tey, ihe light-greon apple
tangs on ihe greon traa`;

// 1) Use ^ to fix the matching at the beginning of the string, and right after newline.
buggyMultiline = buggyMultiline.replace(/^t/gim, "h");
console.log(1, buggyMultiline); // fix 'tey' => 'hey' and 'tangs' => 'hangs' but do not touch 'traa'.

// 2) Use $ to fix matching at the end of the text.
buggyMultiline = buggyMultiline.replace(/aa$/gim, "ee.");
console.log(2, buggyMultiline); // fix 'traa' => 'tree.'.

// 3) Use \b to match characters right on border between a word and a space.
buggyMultiline = buggyMultiline.replace(/\bi/gim, "t");
console.log(3, buggyMultiline); // fix 'ihe' => 'the' but do not touch 'light'.

// 4) Use \B to match characters inside borders of an entity.
fixedMultiline = buggyMultiline.replace(/\Bo/gim, "e");
console.log(4, fixedMultiline); // fix 'greon' => 'green' but do not touch 'on'.

Den Anfang der Eingabe mit dem Steuerzeichen ^ finden

Verwenden Sie ^, um eine Übereinstimmung am Anfang der Eingabe zu finden. In diesem Beispiel können wir mit dem regulären Ausdruck /^A/ die Früchte ermitteln, deren Namen mit „A“ beginnen. Um die passenden Früchte auszuwählen, können wir die Methode filter mit einer Pfeilfunktion verwenden.

js
const fruits = ["Apple", "Watermelon", "Orange", "Avocado", "Strawberry"];

// Select fruits started with 'A' by /^A/ Regex.
// Here '^' control symbol used only in one role: Matching beginning of an input.

const fruitsStartsWithA = fruits.filter((fruit) => /^A/.test(fruit));
console.log(fruitsStartsWithA); // [ 'Apple', 'Avocado' ]

Im zweiten Beispiel wird ^ sowohl verwendet, um eine Übereinstimmung am Anfang der Eingabe zu finden, als auch, um innerhalb von Zeichenklassen eine negierte oder komplementäre Zeichenklasse zu erstellen.

js
const fruits = ["Apple", "Watermelon", "Orange", "Avocado", "Strawberry"];

// Selecting fruits that do not start by 'A' with a /^[^A]/ regex.
// In this example, two meanings of '^' control symbol are represented:
// 1) Matching beginning of the input
// 2) A negated or complemented character class: [^A]
// That is, it matches anything that is not enclosed in the square brackets.

const fruitsStartsWithNotA = fruits.filter((fruit) => /^[^A]/.test(fruit));

console.log(fruitsStartsWithNotA); // [ 'Watermelon', 'Orange', 'Strawberry' ]

Weitere Beispiele finden Sie in der Referenz zur Assertion für Eingabegrenzen.

Eine Wortgrenze finden

In diesem Beispiel suchen wir nach Fruchtnamen, die ein Wort enthalten, das auf „en“ oder „ed“ endet.

js
const fruitsWithDescription = ["Red apple", "Orange orange", "Green Avocado"];

// Select descriptions that contains 'en' or 'ed' words endings:
const enEdSelection = fruitsWithDescription.filter((description) =>
  /(?:en|ed)\b/.test(description),
);

console.log(enEdSelection); // [ 'Red apple', 'Green Avocado' ]

Weitere Beispiele finden Sie in der Referenz zur Assertion für Wortgrenzen.

Lookahead-Assertion

In diesem Beispiel suchen wir nach dem Wort „First“, aber nur, wenn darauf das Wort „test“ folgt. „test“ wird dabei nicht in das Übereinstimmungsergebnis aufgenommen.

js
const regex = /First(?= test)/g;

console.log("First test".match(regex)); // [ 'First' ]
console.log("First peach".match(regex)); // null
console.log("This is a First test in a year.".match(regex)); // [ 'First' ]
console.log("This is a First peach in a month.".match(regex)); // null

Weitere Beispiele finden Sie in der Referenz zur Lookahead-Assertion.

Einfache negative Lookahead-Assertion

Beispielsweise entspricht /\d+(?!\.)/ einer Zahl nur, wenn darauf kein Dezimalpunkt folgt. /\d+(?!\.)/.exec('3.141') entspricht „141“, aber nicht „3“.

js
console.log(/\d+(?!\.)/g.exec("3.141")); // [ '141', index: 2, input: '3.141' ]

Weitere Beispiele finden Sie in der Referenz zur Lookahead-Assertion.

Unterschiedliche Bedeutung der Kombination '?!' in Assertions und Zeichenklassen

Die Kombination ?! hat in Assertions wie /x(?!y)/ eine andere Bedeutung als in Zeichenklassen wie [^?!].

js
const orangeNotLemon =
  "Do you want to have an orange? Yes, I do not want to have a lemon!";

// Different meaning of '?!' combination usage in Assertions /x(?!y)/ and Ranges /[^?!]/
const selectNotLemonRegex = /[^?!]+have(?! a lemon)[^?!]+[?!]/gi;
console.log(orangeNotLemon.match(selectNotLemonRegex)); // [ 'Do you want to have an orange?' ]

const selectNotOrangeRegex = /[^?!]+have(?! an orange)[^?!]+[?!]/gi;
console.log(orangeNotLemon.match(selectNotOrangeRegex)); // [ ' Yes, I do not want to have a lemon!' ]

Lookbehind-Assertion

In diesem Beispiel ersetzen wir das Wort „orange“ nur dann durch „apple“, wenn davor das Wort „ripe“ steht.

js
const oranges = ["ripe orange A", "green orange B", "ripe orange C"];

const newFruits = oranges.map((fruit) =>
  fruit.replace(/(?<=ripe )orange/, "apple"),
);
console.log(newFruits); // ['ripe apple A', 'green orange B', 'ripe apple C']

Weitere Beispiele finden Sie in der Referenz zur Lookbehind-Assertion.

Siehe auch