Beperking van gierigheid in gereelde uitdrukkings in JavaScript
Gereelde uitdrukkings is by verstek gierig. Dit beteken dat hulle die maksimum moontlike hoeveelheid karakters vasvang. Kom ons kyk na 'n voorbeeld. Gestel ons het die volgende string:
let str = 'aeeex zzz x kkk';
Gestel ons wil in hierdie string die substring
'aeeex' vind volgens die volgende patroon: letter
'a', dan enige karakter een of meer
keer, dan letter 'x'.
let res = str.replace(/a.+x/g, '!');
Ons verwag dat die string '! zzz x kkk' in die
veranderlike sal wees. Dit gebeur egter nie
nie - die string '! kkk' word in die veranderlike gekry.
Die rede is dat ons gereelde uitdrukking alle
karakters van letter 'a' tot letter 'x' soek.
Maar in ons string is daar twee letters 'x'! As gevolg
van gierigheid, soek die gereelde uitdrukking tot
die heel laaste x, en vang sodoende nie vas wat
ons verwag het nie.
Natuurlik is hierdie gedrag dikwels wat ons nodig het. Maar spesifiek in hierdie geval wil ons die gierigheid kanselleer en vir die gereelde uitdrukking sê dat dit tot by die eerste x moet soek.
Om gierigheid te beperk, moet jy 'n vraagteken plaas na die herhalingsoperator:
let res = str.replace(/a.+?x/g, '!');
Gierigheid kan vir alle herhalingsoperatore
beperk word: beide *, en ?, en {}
- soos volg: *?, ?? en {}?.
Gegee die string:
let str = 'aba accca azzza wwwwa';
Skryf 'n gereelde uitdrukking wat alle strings vind
waar die letters 'a' aan weerskante is,
en vervang elkeen met '!'. Tussen
die letters 'a' kan enige karakter wees (behalwe
'a').