Begrænsning af grådighed i regulære udtryk i JavaScript
Regulære udtryk er som standard grådige. Det betyder, at de fanger det maksimalt mulige antal tegn. Lad os se på et eksempel. Antag, at vi har følgende streng:
let str = 'aeeex zzz x kkk';
Antag, at vi i denne streng ønsker at finde delstrengen
'aeeex' ved hjælp af følgende mønster: bogstavet
'a', derefter ethvert tegn en eller flere
gange, derefter bogstavet 'x'.
let res = str.replace(/a.+x/g, '!');
Vi forventer, at der som resultat bliver
skrevet strengen '! zzz x kkk' til variablen. Men
det sker ikke - i stedet får variablen strengen
'! kkk'.
Årsagen er, at vores regulære udtryk søger alle
tegn fra bogstavet 'a' til bogstavet 'x'.
Men i vores streng er der to bogstaver 'x'! På grund af
grådigheden sker det, at det regulære udtryk søger helt til
den sidste 'x', og derved fanger den
noget andet, end vi forventede.
Selvfølgelig er denne opførsel ofte det, vi har brug for. Men lige i dette tilfælde ville vi ønske at ophæve grådigheden og fortælle det regulære udtryk, at det skal søge til den første 'x'.
For at begrænse grådigheden skal du sætte et spørgsmålstegn efter gentagelsesoperatoren:
let res = str.replace(/a.+?x/g, '!');
Grådighed kan begrænses for alle gentagelsesoperatorer:
både *, ? og {}
- sådan her: *?, ?? og {}?.
Givet strengen:
let str = 'aba accca azzza wwwwa';
Skriv et regulært udtryk, der finder alle strenge
hvor kanterne er bogstaverne 'a',
og erstatter hver af dem med '!'. Mellem
bogstaverne 'a' kan der være ethvert tegn (undtagen
'a').