Limitarea lăcomiei în expresiile regulate în JavaScript
Expresiile regulate sunt implicit lăcomase. Aceasta înseamnă că ele captează numărul maxim posibil de caractere. Să analizăm un exemplu. Să presupunem că avem următorul șir:
let str = 'aeeex zzz x kkk';
Să presupunem că în acest șir vrem să găsim subșirul
'aeeex' după următorul model: litera
'a', apoi orice caracter unul sau mai multe
ori, apoi litera 'x'.
let res = str.replace(/a.+x/g, '!');
Ne așteptăm ca în variabilă în rezultat
să se scrie șirul '! zzz x kkk'. Cu toate acestea,
nu este așa - în variabilă ajunge șirul
'! kkk'.
Totul se datorează faptului că expresia noastră regulată caută toate
caracterele de la litera 'a' până la litera 'x'.
Dar în șirul nostru sunt două litere 'x'! Din cauza
lăcomiei se întâmplă că expresia regulată caută până la
ultimul x, captând astfel
ceea ce nu ne așteptam.
Desigur, adesea acest comportament este exact ceea ce avem nevoie. Dar în acest caz specific am dori să anulăm lăcomia și să-i spunem expresiei regulate să caute până la primul x.
Pentru a limita lăcomia, trebuie să puneți semnul întrebării după operatorul de repetare:
let res = str.replace(/a.+?x/g, '!');
Lăcomia poate fi limitată pentru toți operatorii
de repetare: și *, și ?, și {}
- astfel: *?, ?? și {}?.
Este dat șirul:
let str = 'aba accca azzza wwwwa';
Scrieți o expresie regulată care va găsi toate șirurile
la ale căror margini sunt literele 'a',
și le va înlocui pe fiecare cu '!'. Între
literele 'a' poate fi orice caracter (cu excepția
'a').