Greediness-Einschränkung in Regex in JavaScript
Reguläre Ausdrücke sind standardmäßig gierig. Das bedeutet, dass sie die maximal mögliche Anzahl von Zeichen erfassen. Lassen Sie uns das an einem Beispiel erläutern. Angenommen, wir haben folgenden String:
let str = 'aeeex zzz x kkk';
Angenommen, wir möchten in diesem String den Teilstring
'aeeex' nach folgendem Muster finden: Buchstabe
'a', dann ein beliebiges Zeichen ein- oder mehrmals,
dann der Buchstabe 'x'.
let res = str.replace(/a.+x/g, '!');
Wir erwarten, dass das Ergebnis in der Variable der String
'! zzz x kkk' ist. Allerdings ist das nicht der Fall -
in die Variable gelangt der String
'! kkk'.
Der Grund liegt darin, dass unser Regex alle
Zeichen vom Buchstaben 'a' bis zum Buchstaben 'x' sucht.
Aber in unserem String gibt es zwei Buchstaben 'x'! Aufgrund
der Gier sucht der Regex bis
zum letzten 'x', wodurch er mehr erfasst,
als wir erwartet haben.
Natürlich ist dieses Verhalten oft genau das, was wir brauchen. Aber in diesem speziellen Fall möchten wir die Gier deaktivieren und dem Regex sagen, dass er nur bis zum ersten 'x' suchen soll.
Um die Gier einzuschränken, muss nach dem Quantor ein Fragezeichen gesetzt werden:
let res = str.replace(/a.+?x/g, '!');
Die Gier kann bei allen Quantoren
eingeschränkt werden: also bei *, ? und {}
- so: *?, ?? und {}?.
Gegeben ist der String:
let str = 'aba accca azzza wwwwa';
Schreiben Sie einen regulären Ausdruck, der alle Strings findet,
an deren Rändern der Buchstabe 'a' steht,
und ersetzt jede davon durch '!'. Zwischen
den Buchstaben 'a' kann ein beliebiges Zeichen stehen (außer
'a').