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 Anfänge und Enden von Zeilen und Wörtern kennzeichnen, sowie andere Muster, die auf irgendeine Weise anzeigen, dass ein Treffer möglich ist (einschließlich Vorwärtssuche, Rückwärtssuche und bedingten Ausdrücken).

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

Grenztypen von Assertions

Zeichen Bedeutung
^

Start-Grenzassertion: Passt am Anfang der Eingabe. Wenn das multiline (m) Flag aktiviert ist, passt es auch unmittelbar nach einem Zeilenumbruch. Zum Beispiel, /^A/ passt nicht auf das "A" in "an A", aber es passt auf das erste "A" in "An A".

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

$

End-Grenzassertion: Passt am Ende der Eingabe. Wenn das multiline (m) Flag aktiviert ist, passt es auch unmittelbar vor einem Zeilenumbruch. Zum Beispiel, /t$/ passt nicht auf das "t" in "eater", wohl aber auf das in "eat".

\A

Pufferanfang-Grenzassertion: Passt am Anfang des gesamten Strings unabhängig von der Anwesenheit des m Flags. Nur gültig im Unicode-Modus.

\z

Pufferend-Grenzassertion: Passt am Ende des gesamten Strings unabhängig von der Anwesenheit des m Flags. Nur gültig im Unicode-Modus.

\Z

Pufferend-Grenzassertion mit optionalem Zeilenumbruch: Passt am Ende des gesamten Strings, erlaubt jedoch ein optionales nachgestelltes Zeilenumbruchzeichen (entweder ein Zeilenendezeichen oder eine \r\n Sequenz). Nur gültig im Unicode-Modus.

\b

Wortgrenz-Assertion: Passt an eine Wortgrenze. Das ist die Position, an der ein Wortzeichen nicht von einem anderen Wortzeichen gefolgt oder vorangegangen wird, beispielsweise zwischen einem Buchstaben und einem Leerzeichen. Beachten Sie, dass eine übereinstimmende Wortgrenze nicht in der Übereinstimmung enthalten ist. Mit anderen Worten, die Länge einer übereinstimmenden Wortgrenze ist null.

Beispiele:

  • /\bm/ passt auf das "m" in "moon".
  • /oo\b/ passt nicht auf das "oo" in "moon", weil "oo" von "n" gefolgt wird, was ein Wortzeichen ist.
  • /oon\b/ passt auf das "oon" in "moon", weil "oon" das Ende des Strings ist, also nicht von einem Wortzeichen gefolgt wird.
  • /\w\b\w/ wird nie etwas treffen, weil ein Wortzeichen nie von einem Nicht-Wort- und einem Wortzeichen gefolgt sein kann.

Um ein Rücktastenzeichen ([\b]) zu treffen, siehe Zeichenklassen.

\B

Nicht-Wortgrenz-Assertion: Passt an eine Nicht-Wortgrenze. Dies ist eine Position, an der das vorherige und das nächste Zeichen vom gleichen Typ sind: Entweder beide müssen Wörter sein, oder beide müssen keine Wörter sein, wie zum Beispiel zwischen zwei Buchstaben oder zwischen zwei Leerzeichen. Der Anfang und das Ende eines Strings werden als Nicht-Wörter betrachtet. Genau wie die übereinstimmende Wortgrenze ist auch die übereinstimmende Nicht-Wortgrenze nicht im Treffer enthalten. Zum Beispiel, /\Bon/ passt auf "on" in "at noon", und /ye\B/ passt auf "ye" in "possibly yesterday".

Andere Assertions

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

Zeichen Bedeutung
x(?=y)

Vorwärtssuche-Assertion: Passt "x" nur, wenn "x" von "y" gefolgt wird. Zum Beispiel, /Jack(?=Sprat)/ passt auf "Jack" nur, wenn es von "Sprat" gefolgt wird.
/Jack(?=Sprat|Frost)/ passt auf "Jack" nur, wenn es von "Sprat" oder "Frost" gefolgt wird. Allerdings ist weder "Sprat" noch "Frost" Teil der Treffenergebnisse.

x(?!y)

Negative Vorwärtssuche-Assertion: Passt "x" nur, wenn "x" nicht von "y" gefolgt wird. Zum Beispiel, /\d+(?!\.)/ passt eine Zahl nur, wenn sie nicht von einem Dezimalpunkt gefolgt wird. /\d+(?!\.)/.exec('3.141') passt auf "141" aber nicht auf "3".

(?<=y)x

Rückwärtssuche-Assertion: Passt "x" nur, wenn "x" von "y" vorausgegangen wird. Zum Beispiel, /(?<=Jack)Sprat/ passt auf "Sprat" nur, wenn es von "Jack" vorausgegangen wird. /(?<=Jack|Tom)Sprat/ passt auf "Sprat" nur, wenn es von "Jack" oder "Tom" vorausgegangen wird. Allerdings ist weder "Jack" noch "Tom" Teil der Treffenergebnisse.

(?<!y)x

Negative Rückwärtssuche-Assertion: Passt "x" nur, wenn "x" nicht von "y" vorausgegangen wird. Zum Beispiel, /(?<!-)\d+/ passt eine Zahl nur, wenn sie nicht von einem Minuszeichen vorausgegangen wird. /(?<!-)\d+/.exec('3') passt auf "3". /(?<!-)\d+/.exec('-3') findet keinen Treffer, weil die Zahl von einem Minuszeichen vorausgegangen wird.

Beispiele

Allgemeines Übersicht-Beispiel für Grenztypen

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'.

Passend zum Anfang der Eingabe mit einem ^ Steuerzeichen

Verwenden Sie ^, um am Anfang der Eingabe zu passen. In diesem Beispiel können wir die Früchte, die mit 'A' beginnen, durch einen /^A/ Regex bekommen. Für die Auswahl der passenden Früchte können wir die filter Methode mit einer Arrow-Funktion nutzen.

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 am Anfang der Eingabe zu passen, als auch um eine negierte oder komplementierte Zeichenklasse zu erstellen, wenn es innerhalb von Zeichenklassen verwendet wird.

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 im Start-Grenzassertion Referenz.

Passend zu einer Wortgrenze

In diesem Beispiel passen wir 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 im Wortgrenz-Assertion Referenz.

Vorwärtssuche-Assertion

In diesem Beispiel passen wir das Wort "First" nur, wenn es von dem Wort "test" gefolgt wird, jedoch schließen wir "test" nicht in die Treffenergebnisse ein.

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 im Vorwärtssuche-Assertion Referenz.

Grundlegende negative Vorwärtssuche-Assertion

Zum Beispiel, /\d+(?!\.)/ passt eine Zahl nur, wenn sie nicht von einem Dezimalpunkt gefolgt wird. /\d+(?!\.)/.exec('3.141') passt auf "141", aber nicht auf "3".

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

Weitere Beispiele finden Sie im Vorwärtssuche-Assertion Referenz.

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

Die ?! Kombination hat unterschiedliche Bedeutungen in Assertions wie /x(?!y)/ und 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!' ]

Rückwärtssuche-Assertion

In diesem Beispiel ersetzen wir das Wort "orange" durch "apple" nur, wenn es von dem Wort "ripe" vorausgegangen wird.

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 im Rückwärtssuche-Assertion Referenz.

Siehe auch