Ограничување на алчноста во регуларните изрази во JavaScript
Регуларните изрази по default се алчни. Ова значи дека тие захваќаат максимално можен број на знаци. Ајде да разгледаме на пример. Нека имаме вакава низа:
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, '!');
Алчноста може да се ограничи на сите оператори
за повторување: и *, и ?, и {}
- еве вака: *?, ?? и {}?.
Дадена е низа:
javascriptlet str = 'aba accca azzza wwwwa';
Напишете регуларен израз, кој ќе ги најде сите низи
чии рабови се букви 'a',
и ќе ја замени секоја од нив со '!'. Помеѓу
буквите 'a' може да има било кој знак (освен
'a').