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í:
'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:
'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':
'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':
'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':
'baaa'.replace(/(?<!x)aaa/g, '!'); // vráti 'b!'
Praktické úlohy
Daný je reťazec obsahujúci názvy funkcií:
let str = 'func1() func2() func3()';
Získajte pole názvov funkcií z reťazca.
Daný je reťazec s tagom:
let str = '<a href="" class="eee" id="zzz">';
Získajte pole názvov atribútov tohto tagu.
Daný je reťazec s premennými:
let str = '$aaa $bbb $ccc xxxx';
Získajte podreťazce, pred ktorými je znak dolára.