Позитивен и негативен преглед в JavaScript регулярни изрази
Понякога трябва да решим задача от този тип: намери
низ 'aaa' и го замени с '!',
но само ако след 'aaa' има
'x', като самият 'x'
не се заменя. Ако се опитаме да решим задачата
'директно', няма да успеем:
'aaax baaa'.replace(/aaax/g, '!'); // връща '! baaa', а искахме '!x baaa'
Предишен преглед
За решаване на задачата е необходим начин да кажем,
че 'x' не трябва да бъде заменен. Това се
прави със специални скоби (?= ),
които само проверяват, но не вземат със себе си.
Тези скоби се наричат позитивен преглед
напред. Позитивен - защото 'x'
(в нашия случай) трябва да има - само тогава
ще се извърши замяна.
Нека приложим тези скоби за решаване на нашата задача:
'aaax aaab'.replace(/aaa(?=x)/g, '!'); // връща '!x aaab'
Има и негативен преглед напред
- (?! ) - той, обратно, казва, че
нещо не трябва да има. В следващия пример,
замяната ще се извърши, само ако след 'aaa'
няма 'x':
'aaax aaab'.replace(/aaa(?!x)/g, '!'); // връща 'aaax !b'
Обратен преглед
По подобен начин има позитивен обратен
преглед - (?<= ). В следващия
пример замяната ще се извърши, само ако преди
'aaa' има 'x':
'xaaa'.replace(/(?<=x)aaa/g, '!'); // връща 'x!'
Има също и негативен обратен преглед
- (?<! ). В следващия пример замяната
ще се извърши, само ако преди 'aaa'
няма 'x':
'baaa'.replace(/(?<!x)aaa/g, '!'); // връща 'b!'
Практически задачи
Даден е низ, съдържащ имена на функции:
let str = 'func1() func2() func3()';
Получете масив от имената на функциите от низа.
Даден е низ с таг:
let str = '<a href="" class="eee" id="zzz">';
Получете масив от имената на атрибутите на този таг.
Даден е низ с променливи:
let str = '$aaa $bbb $ccc xxxx';
Получете поднизове, пред които има знак за долар.