ჯავასკრიპტში რეგულარული გამონათქვამების გლუვობის შეზღუდვა

რეგულარული გამონათქვამები ნაგულისხმევად არის გლუვი. ეს ნიშნავს, რომ ისინი იღებენ მაქსიმალურ შესაძლო რაოდენობის სიმბოლოს. მოდით განვიხილოთ მაგალითი. დავუშვათ, რომ ჩვენ გვაქვს ასეთი სტრიქონი:

javascriptlet str = 'aeeex zzz x kkk';

დავუშვათ, ამ სტრიქონში ჩვენ გვსურს ვიპოვოთ ქვესტრიქონი 'aeeex' შემდეგი შაბლონით: ასო 'a', შემდეგ ნებისმიერი სიმბოლო ერთი ან მეტი ჯერ, შემდეგ ასო 'x'.

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

ჩვენ ველით, რომ ცვლადში შედეგად ჩაიწერება სტრიქონი '! zzz x kkk'. თუმცა, ეს ასე არ არის - ცვლადში მოხვდება სტრიქონი '! kkk'.

მთელი საქმე იმაშია, რომ ჩვენი რეგულარული გამონათქვამი ეძებს ყველა სიმბოლოს ასო 'a'-დან ასო 'x'-მდე. მაგრამ ჩვენს სტრიქონში ორი ასო 'x' არის! გლუვობის გამო გამოდის, რომ რეგულარული გამონათქვამი ეძებს ბოლო x-მდე, რითაც იღებს არა ისეთს, როგორსაც ჩვენ ველოდით.

რა თქმა უნდა, ხშირად ასეთი ქცევა გვჭირდება. მაგრამ კონკრეტულად ამ შემთხვევაში ჩვენ გვსურს გავაუქმოთ გლუვობა და ვუთხრათ რეგულარულ გამონათქვამს, რომ იპოვოს პირველ x-მდე.

გლუვობის შესაზღუდად, საჭიროა ოპერატორის შემდეგ გამეორების დასმა კითხვის ნიშანი:

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

გლუვობის შეზღუდვა შესაძლებელია ყველა ოპერატორზე გამეორების: და *, და ?, და {} - აი ასე: *?, ?? და {}?.

Задание 1

მოცემულია სტრიქონი:

javascriptlet str = 'aba accca azzza wwwwa';

დაწერეთ რეგულარული გამონათქვამი, რომელიც იპოვის ყველა სტრიქონს რომლის კიდეებზეც დგას ასო 'a', და შეცვლის თითოეულ მათგანს '!'-ით. ასოებს 'a' შორის შეიძლება იყოს ნებისმიერი სიმბოლო (გარდა 'a'-ის).