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 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 |
\A |
Assertion für den Anfang des Buffers: Entspricht dem Anfang der gesamten Zeichenfolge, unabhängig davon, ob das Flag |
\z |
Assertion für das Ende des Buffers: Entspricht dem Ende der gesamten Zeichenfolge, unabhängig davon, ob das Flag |
\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 |
\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:
Wie Sie ein Rückschrittzeichen ( |
\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 |
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
|
x(?!y) |
Negative Lookahead-Assertion:
Entspricht „x“ nur, wenn darauf nicht „y“ folgt. Beispielsweise
entspricht |
(?<=y)x |
Lookbehind-Assertion:
Entspricht „x“ nur, wenn davor „y“ steht. Beispielsweise entspricht
|
(?<!y)x |
Negative Lookbehind-Assertion:
Entspricht „x“ nur, wenn davor nicht „y“ steht. Beispielsweise
entspricht |
Beispiele
>Allgemeines Beispiel für Assertions für Grenzen
// 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.
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.
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.
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.
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“.
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 [^?!].
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.
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
- Leitfaden zu regulären Ausdrücken
- Leitfaden zu Zeichenklassen
- Leitfaden zu Quantifizierern
- Leitfaden zu Gruppen und Rückverweisen
RegExp- Referenz zu regulären Ausdrücken
- Assertion für Eingabegrenzen:
^,$ - Lookahead-Assertion:
(?=...),(?!...) - Lookbehind-Assertion:
(?<=...),(?<!...) - Assertion für Wortgrenzen:
\b,\B