Regularās izteiksmes mantkārības ierobežošana JavaScript

Regularās izteiksmes pēc noklusējuma ir mantkārīgas. Tas nozīmē, ka tās notver pēc iespējas vairāk rakstzīmes. Analizēsim to ar piemēru. Pieņemsim, ka mums ir šāda virkne:

javascriptlet str = 'aeeex zzz x kkk';

Pieņemsim, ka šajā virknē vēlamies atrast apakšvirkni 'aeeex' saskaņā ar šādu veidni: burts 'a', pēc tam jebkura rakstzīme vienu vai vairāk reizes, pēc tam burts 'x'.

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

Mēs sagaidām, ka mainīgā rezultātā tiks ierakstīta virkne '! zzz x kkk'. Tomēr tā nenotiek - mainīgā nonāk virkne '! kkk'.

Lieta ir tajā, ka mūsu regularā izteiksme meklē visas rakstzīmes no burta 'a' līdz burtam 'x'. Bet mūsu virknē ir divi burti 'x'! Mantkārības dēļ izrādās, ka regularā izteiksme meklē līdz pat pēdējā x, tādējādi notverot ne to, ko mēs gaidījām.

Protams, bieži vien šāda uzvedība mums ir vajadzīga. Bet tieši šajā gadījumā mēs vēlētos atcelt mantkārību un likt regularajai izteiksmei meklēt līdz pirmajam x.

Lai ierobežotu mantkārību, aiz atkārtojuma operatora jāieliek jautājuma zīme:

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

Mantkārību var ierobežot visiem atkārtojuma operatoriem: gan *, gan ?, gan {} - šādi: *?, ?? un {}?.

Задание 1

Dota virkne:

javascriptlet str = 'aba accca azzza wwwwa';

Uzrakstiet regularu izteiksmi, kas atradīs visas virknes, kuru malās ir burti 'a', un aizvietos katru no tām ar '!'. Starp burtiem 'a' var būt jebkura rakstzīme (izņemot 'a').