Позитивен и негативен преглед во регуларните изрази на 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';
Добијте поднизи пред кои има знак за долар.