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