Pozitívny a negatívny prehľad v regulárnych výrazoch JavaScript

Niekedy je potrebné vyriešiť úlohu tohto typu: nájsť reťazec 'aaa' a nahradiť ho '!', ale len ak za 'aaa' nasleduje 'x', pričom samotné 'x' sa nenahrádza. Ak sa pokúsime úlohu vyriešiť 'priamo', nič sa nám nepodarí:

javascript'aaax baaa'.replace(/aaax/g, '!'); // vráti '! baaa', ale chceli sme '!x baaa'

Prehľad dopredu

Na vyriešenie úlohy potrebujeme spôsob, ako povedať, že 'x' by sa nemalo nahradiť. To sa vykonáva pomocou špeciálnych zátvoriek (?= ), ktoré len prehliadajú, ale neberú so sebou.

Tieto zátvorky sa nazývajú pozitívny prehľad dopredu. Pozitívny - pretože 'x' (v našom prípade) musí byť prítomný - až vtedy prebehne nahradenie.

Aplikujme tieto zátvorky na vyriešenie našej úlohy:

javascript'aaax aaab'.replace(/aaa(?=x)/g, '!'); // vráti '!x aaab'

Existuje aj negatívny prehľad dopredu - (?! ) - ten naopak hovorí, že niečo by nemalo byť prítomné. V nasledujúcom príklade k nahradeniu dôjde len vtedy, ak za 'aaa' nenasleduje 'x':

javascript'aaax aaab'.replace(/aaa(?!x)/g, '!'); // vráti 'aaax !b'

Prehľad dozadu

Analogicky existuje pozitívny prehľad dozadu - (?<= ). V nasledujúcom príklade k nahradeniu dôjde len vtedy, ak pred 'aaa' je 'x':

javascript'xaaa'.replace(/(?<=x)aaa/g, '!'); // vráti 'x!'

A tiež existuje negatívny prehľad dozadu - (?<! ). V nasledujúcom príklade k nahradeniu dôjde len vtedy, ak pred 'aaa' nie je 'x':

javascript'baaa'.replace(/(?<!x)aaa/g, '!'); // vráti 'b!'

Praktické úlohy

Задание 1

Daný je reťazec obsahujúci názvy funkcií:

javascriptlet str = 'func1() func2() func3()';

Získajte pole názvov funkcií z reťazca.

Задание 2

Daný je reťazec s tagom:

javascriptlet str = '<a href="" class="eee" id="zzz">';

Získajte pole názvov atribútov tohto tagu.

Задание 3

Daný je reťazec s premennými:

javascriptlet str = '$aaa $bbb $ccc xxxx';

Získajte podreťazce, pred ktorými je znak dolára.