Ograničavanje pohlepe u regularnim izrazima u JavaScriptu
Regularni izrazi su podrazumevano pohlepni. To znači da hvataju maksimalan mogući broj karaktera. Hajde da razmotrimo primer. Pretpostavimo da imamo ovakav string:
let str = 'aeeex zzz x kkk';
Pretpostavimo da u ovom stringu želimo da pronađemo podstring
'aeeex' prema sledećem šablonu: slovo
'a', zatim bilo koji karakter jedan ili više
puta, zatim slovo 'x'.
let res = str.replace(/a.+x/g, '!');
Očekujemo da će se u promenljivu kao rezultat
upisati string '! zzz x kkk'. Međutim,
nije tako - u promenljivu se upisuje string
'! kkk'.
Stvar je u tome što naš regularni izraz traži sve
karaktere od slova 'a' do slova 'x'.
Ali u našem stringu postoja dva slova 'x'! Zbog
pohlepe se ispostavlja da regularni izraz traži do
poslednjeg 'x', time hvatajući
ne ono što smo očekivali.
Naravno, često je takvo ponašanje upravo ono što nam treba. Ali konkretno u ovom slučaju želeli bismo da isključimo pohlepu i kažemo regularnom izrazu da traži do prvog 'x'.
Da bismo ograničili pohlepu, potrebno je posle operatora ponavljanja staviti znak pitanja:
let res = str.replace(/a.+?x/g, '!');
Pohlepu možemo ograničiti svim operatorima
ponavljanja: i *, i ?, i {}
- ovako: *?, ?? i {}?.
Dat je string:
let str = 'aba accca azzza wwwwa';
Napišite regularni izraz koji će pronaći sve stringove
na čijim krajevima stoje slova 'a',
i zameniti svaki od njih sa '!'. Između
slova 'a' može biti bilo koji karakter (osim
'a').