Quantifizierer

Quantifizierer geben die Anzahl der Zeichen oder Ausdrücke an, die übereinstimmen sollen.

Probieren Sie es aus

const ghostSpeak = "booh boooooooh";
const regexpSpooky = /bo{3,}h/;
console.log(ghostSpeak.match(regexpSpooky));
// Expected output: Array ["boooooooh"]

const modifiedQuote = "[He] ha[s] to go read this novel [Alice in Wonderland].";
const regexpModifications = /\[.*?\]/g;
console.log(modifiedQuote.match(regexpModifications));
// Expected output: Array ["[He]", "[s]", "[Alice in Wonderland]"]

const regexpTooGreedy = /\[.*\]/g;
console.log(modifiedQuote.match(regexpTooGreedy));
// Expected output: Array ["[He] ha[s] to go read this novel [Alice in Wonderland]"]

Typen

Hinweis: Im Folgenden bezieht sich Item nicht nur auf einzelne Zeichen, sondern umfasst auch Zeichenklassen sowie Gruppen und Rückverweise.

Zeichen Bedeutung
x*

Passt zum vorangehenden Element "x" 0- oder mehrmals. Zum Beispiel passt /bo*/ in "A ghost booooed" zu "boooo" und in "A bird warbled" zu "b", aber zu nichts in "A goat grunted".

x+

Passt zum vorangehenden Element "x" 1- oder mehrmals. Entspricht {1,}. Zum Beispiel passt /a+/ zur "a" in "candy" und allen "a"s in "caaaaaaandy".

x?

Passt zum vorangehenden Element "x" 0- oder 1-mal. Zum Beispiel passt /e?le?/ zur "el" in "angel" und zur "le" in "angle".

Wenn unmittelbar nach einem der Quantifizierer *, +, ? oder {} verwendet, macht es den Quantifizierer nicht-gierig (er sucht die minimale Anzahl an Passungen), im Gegensatz zur Standardeinstellung, bei der er gierig ist (die maximale Anzahl an Passungen).

x{n}

Wo "n" eine nicht-negative ganze Zahl ist, entspricht dies genau "n" Vorkommen des vorangehenden Elements "x". Zum Beispiel passt /a{2}/ nicht zur "a" in "candy", aber zu allen "a"s in "caandy" und den ersten beiden "a"s in "caaandy".

x{n,}

Wo "n" eine nicht-negative ganze Zahl ist, passt es zu mindestens "n" Vorkommen des vorangehenden Elements "x". Zum Beispiel passt /a{2,}/ nicht zur "a" in "candy", aber zu allen "a"s in "caandy" und in "caaaaaaandy".

x{n,m}

Wo "n" und "m" nicht-negative ganze Zahlen sind und m >= n, passt es zu mindestens "n" und höchstens "m" Vorkommen des vorangehenden Elements "x". Zum Beispiel passt /a{1,3}/ zu nichts in "cndy", zur "a" in "candy", zu den zwei "a"s in "caandy" und zu den ersten drei "a"s in "caaaaaaandy". Beachten Sie, dass bei der Übereinstimmung mit "caaaaaaandy" das Ergebnis "aaa" ist, obwohl die ursprüngliche Zeichenkette mehr "a"s enthält.

x*?
x+?
x??
x{n}?
x{n,}?
x{n,m}?

Standardmäßig sind Quantifizierer wie * und + "gierig", das heißt, sie versuchen, so viel von der Zeichenkette wie möglich abzugleichen. Das Zeichen ? nach dem Quantifizierer macht den Quantifizierer "nicht-gierig": Das bedeutet, dass er aufhört, sobald er eine Übereinstimmung findet. Zum Beispiel wird bei einer Zeichenkette wie "some <foo> <bar> new </bar> </foo> thing":

  • /<.*>/ "<foo> <bar> new </bar> </foo>" abgleichen
  • /<.*?>/ "<foo>" abgleichen

Beispiele

Wiederholtes Muster

In diesem Beispiel gleichen wir ein oder mehrere Zeichen eines Wortes mit \w+ ab, dann ein oder mehrere Zeichen "a" mit a+ und enden schließlich an einer Wortgrenze mit \b.

js
const wordEndingWithAs = /\w+a+\b/;
const delicateMessage = "This is Spartaaaaaaa";

console.table(delicateMessage.match(wordEndingWithAs)); // [ "Spartaaaaaaa" ]

Zählen von Zeichen

In diesem Beispiel gleichen wir Wörter ab, die einen Buchstaben haben, Wörter, die zwischen 2 und 6 Buchstaben haben, und Wörter, die 13 oder mehr Buchstaben haben.

js
const singleLetterWord = /\b\w\b/g;
const notSoLongWord = /\b\w{2,6}\b/g;
const longWord = /\b\w{13,}\b/g;

const sentence = "Why do I have to learn multiplication table?";

console.table(sentence.match(singleLetterWord)); // ["I"]
console.table(sentence.match(notSoLongWord)); // [ "Why", "do", "have", "to", "learn", "table" ]
console.table(sentence.match(longWord)); // ["multiplication"]

Optionales Zeichen

In diesem Beispiel gleichen wir Wörter ab, die entweder mit "our" oder "or" enden.

js
const britishText = "He asked his neighbour a favour.";
const americanText = "He asked his neighbor a favor.";

const regexpEnding = /\w+ou?r/g;
// \w+ One or several letters
// o   followed by an "o",
// u?  optionally followed by a "u"
// r   followed by an "r"

console.table(britishText.match(regexpEnding));
// ["neighbour", "favour"]

console.table(americanText.match(regexpEnding));
// ["neighbor", "favor"]

Gierig versus nicht-gierig

In diesem Beispiel gleichen wir ein oder mehrere Zeichen eines Wortes oder Leerzeichen mit [\w ]+ und [\w ]+? ab. Das erste ist gierig, das zweite nicht-gierig. Beachten Sie, wie der zweite bereits stoppt, sobald die minimale Anforderung erfüllt ist.

js
const text = "I must be getting somewhere near the center of the earth.";
const greedyRegexp = /[\w ]+/;

console.log(text.match(greedyRegexp)[0]);
// "I must be getting somewhere near the center of the earth"
// almost all of the text matches (leaves out the dot character)

const nonGreedyRegexp = /[\w ]+?/; // Notice the question mark
console.log(text.match(nonGreedyRegexp));
// "I"
// The match is the smallest one possible

Siehe auch