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 Hinweis: Dieses Zeichen hat eine andere Bedeutung, wenn es am Anfang einer Zeichenklasse erscheint. |
$ |
End-Grenzassertion:
Passt am Ende der Eingabe. Wenn das |
\A |
Pufferanfang-Grenzassertion: Passt am Anfang des gesamten Strings unabhängig von der Anwesenheit des |
\z |
Pufferend-Grenzassertion: Passt am Ende des gesamten Strings unabhängig von der Anwesenheit des |
\Z |
Pufferend-Grenzassertion mit optionalem Zeilenumbruch: Passt am Ende des gesamten Strings, erlaubt jedoch ein optionales nachgestelltes Zeilenumbruchzeichen (entweder ein Zeilenendezeichen oder eine |
\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:
Um ein Rücktastenzeichen ( |
\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,
|
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, |
x(?!y) |
Negative Vorwärtssuche-Assertion:
Passt "x" nur, wenn "x" nicht von "y" gefolgt wird. Zum Beispiel, |
(?<=y)x |
Rückwärtssuche-Assertion:
Passt "x" nur, wenn "x" von "y" vorausgegangen wird. Zum Beispiel,
|
(?<!y)x |
Negative Rückwärtssuche-Assertion:
Passt "x" nur, wenn
"x" nicht von "y" vorausgegangen wird. Zum Beispiel,
|
Beispiele
>Allgemeines Übersicht-Beispiel für Grenztypen
// 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.
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.
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.
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.
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".
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 [^?!].
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.
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
- Reguläre Ausdrücke Leitfaden
- Zeichenklassen Leitfaden
- Quantoren Leitfaden
- Gruppen und Rückverweise Leitfaden
RegExp- Reguläre Ausdrücke Referenz
- Start-Grenzassertion:
^,$ - Vorwärtssuche-Assertion:
(?=...),(?!...) - Rückwärtssuche-Assertion:
(?<=...),(?<!...) - Wortgrenz-Assertion:
\b,\B