ჯავასკრიპტში რეგულარული გამონათქვამების გლუვობის შეზღუდვა
რეგულარული გამონათქვამები ნაგულისხმევად არის გლუვი. ეს ნიშნავს, რომ ისინი იღებენ მაქსიმალურ შესაძლო რაოდენობის სიმბოლოს. მოდით განვიხილოთ მაგალითი. დავუშვათ, რომ ჩვენ გვაქვს ასეთი სტრიქონი:
let str = 'aeeex zzz x kkk';
დავუშვათ, ამ სტრიქონში ჩვენ გვსურს ვიპოვოთ ქვესტრიქონი
'aeeex' შემდეგი შაბლონით: ასო
'a', შემდეგ ნებისმიერი სიმბოლო ერთი ან მეტი
ჯერ, შემდეგ ასო 'x'.
let res = str.replace(/a.+x/g, '!');
ჩვენ ველით, რომ ცვლადში შედეგად
ჩაიწერება სტრიქონი '! zzz x kkk'. თუმცა,
ეს ასე არ არის - ცვლადში მოხვდება სტრიქონი
'! kkk'.
მთელი საქმე იმაშია, რომ ჩვენი რეგულარული გამონათქვამი ეძებს ყველა
სიმბოლოს ასო 'a'-დან ასო 'x'-მდე.
მაგრამ ჩვენს სტრიქონში ორი ასო 'x' არის! გლუვობის
გამო გამოდის, რომ რეგულარული გამონათქვამი ეძებს
ბოლო x-მდე, რითაც იღებს
არა ისეთს, როგორსაც ჩვენ ველოდით.
რა თქმა უნდა, ხშირად ასეთი ქცევა გვჭირდება. მაგრამ კონკრეტულად ამ შემთხვევაში ჩვენ გვსურს გავაუქმოთ გლუვობა და ვუთხრათ რეგულარულ გამონათქვამს, რომ იპოვოს პირველ x-მდე.
გლუვობის შესაზღუდად, საჭიროა ოპერატორის შემდეგ გამეორების დასმა კითხვის ნიშანი:
let res = str.replace(/a.+?x/g, '!');
გლუვობის შეზღუდვა შესაძლებელია ყველა ოპერატორზე
გამეორების: და *, და ?, და {}
- აი ასე: *?, ?? და {}?.
მოცემულია სტრიქონი:
let str = 'aba accca azzza wwwwa';
დაწერეთ რეგულარული გამონათქვამი, რომელიც იპოვის ყველა სტრიქონს
რომლის კიდეებზეც დგას ასო 'a',
და შეცვლის თითოეულ მათგანს '!'-ით.
ასოებს 'a' შორის შეიძლება იყოს ნებისმიერი სიმბოლო (გარდა
'a'-ის).