Begrensning av grådighet i regulære uttrykk i JavaScript
Regulære uttrykk er som standard grådige. Dette betyr at de fanger maksimalt mulig antall tegn. La oss se på et eksempel. La oss si at vi har følgende streng:
let str = 'aeeex zzz x kkk';
La oss si at vi i denne strengen ønsker å finne delstrengen
'aeeex' etter følgende mønster: bokstaven
'a', deretter hvilket som helst tegn en eller flere
ganger, deretter bokstaven 'x'.
let res = str.replace(/a.+x/g, '!');
Vi forventer at variabelen som et resultat
vil inneholde strengen '! zzz x kkk'. Imidlertid
er ikke dette tilfellet - variabelen får strengen
'! kkk'.
Hele poenget er at vårt regulære uttrykk søker etter alle
tegn fra bokstaven 'a' til bokstaven 'x'.
Men i strengen vår er det to bokstaver 'x'! På grunn av
grådigheten blir resultatet at det regulære uttrykket søker til
den siste 'x'en, og fanger dermed
noe annet enn det vi forventet.
Selvfølgelig er denne oppførselen ofte det vi ønsker. Men akkurat i dette tilfellet ønsket vi å oppheve grådigheten og fortelle det regulære uttrykket at det skal søke frem til den første 'x'en.
For å begrense grådigheten, må du sette et spørsmålstegn etter repetisjonsoperatoren:
let res = str.replace(/a.+?x/g, '!');
Grådighet kan begrenses for alle repetisjonsoperatorer:
både *, ?, og {}
- slik: *?, ?? og {}?.
Gitt strengen:
let str = 'aba accca azzza wwwwa';
Skriv et regulært uttrykk som finner alle strenger
som har bokstaven 'a' på kantene,
og erstatter hver av dem med '!'. Mellom
bokstavene 'a' kan det være hvilket som helst tegn (bortsett fra
'a').