Begränsa girighet i reguljära uttryck i JavaScript
Reguljära uttryck är som standard giriga. Det betyder att de fångar maximalt möjligt antal tecken. Låt oss ta ett exempel. Antag att vi har en sträng som ser ut så här:
let str = 'aeeex zzz x kkk';
Antag att vi i denna sträng vill hitta delsträngen
'aeeex' enligt följande mönster: bokstaven
'a', sedan valfritt tecken en eller flera
gånger, sedan bokstaven 'x'.
let res = str.replace(/a.+x/g, '!');
Vi förväntar oss att variabeln som ett resultat
ska innehålla strängen '! zzz x kkk'. Men
så är det inte - variabeln innehåller strängen
'! kkk'.
Anledningen är att vårt reguljära uttryck söker alla
tecken från bokstaven 'a' till bokstaven 'x'.
Men i vår sträng finns det två bokstäver 'x'! På grund av
girigheten händer det så att det reguljära uttrycket söker till
den sista 'x':en, och därmed fångar
inte det vi förväntade oss.
Naturligtvis är detta beteende oftast vad vi behöver. Men just i det här fallet skulle vi vilja avbryta girigheten och tala om för det reguljära uttrycket att det ska söka till den första 'x':en.
För att begränsa girigheten måste du sätta ett frågetecken efter repetitionsoperatorn:
let res = str.replace(/a.+?x/g, '!');
Girighet kan begränsas för alla repetitionsoperatorer:
både *, och ?, och {}
- så här: *?, ?? och {}?.
Given en sträng:
let str = 'aba accca azzza wwwwa';
Skriv ett reguljärt uttryck som hittar alla strängar
som har bokstaven 'a' i båda ändar,
och ersätter varje sådan sträng med '!'. Mellan
bokstäverna 'a' får finnas valfritt tecken (förutom
'a').