Ограничаване на алчността в регулярните изрази в JavaScript
Регулярните изрази по подразбиране са алчни. Това означава, че те захващат максималното възможно количество символи. Нека разгледаме с пример. Да предположим, че имаме следния низ:
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').