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:

javascriptlet 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'.

javascriptlet 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:

javascriptlet res = str.replace(/a.+?x/g, '!');

Grådighet kan begrenses for alle repetisjonsoperatorer: både *, ?, og {} - slik: *?, ?? og {}?.

Задание 1

Gitt strengen:

javascriptlet 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').