Pozitivní a negativní přehled v regulárních výrazech JavaScript
Někdy je třeba vyřešit úlohu tohoto typu: najít
řetězec 'aaa' a nahradit jej '!',
ale pouze pokud za 'aaa' následuje
'x', přičemž samotné 'x'
přitom nenahrazovat. Pokud se pokusíme úlohu
vyřešit 'přímo', nic se nám nepovede:
'aaax baaa'.replace(/aaax/g, '!'); // vrátí '! baaa', ale chtěli jsme '!x baaa'
Přehled dopředu
K vyřešení úlohy je potřeba způsob, jak říct,
že 'x' by se nemělo nahrazovat. To se
dělá pomocí speciálních závorek (?= ),
které pouze hledí, ale neberou si s sebou.
Tyto závorky se nazývají pozitivní přehled dopředu. Pozitivní - protože 'x'
(v našem případě) musí být - teprve potom
dojde k nahrazení.
Aplikujme tyto závorky pro řešení naší úlohy:
'aaax aaab'.replace(/aaa(?=x)/g, '!'); // vrátí '!x aaab'
Existuje i negativní přehled dopředu
- (?! ) - ten naopak říká, že
něco by nemělo být. V následujícím příkladu
dojde k nahrazení, pouze pokud za 'aaa'
nenásleduje 'x':
'aaax aaab'.replace(/aaa(?!x)/g, '!'); // vrátí 'aaax !b'
Přehled dozadu
Podobně existuje pozitivní přehled dozadu
- (?<= ). V následujícím
příkladu dojde k nahrazení, pouze pokud před
'aaa' je 'x':
'xaaa'.replace(/(?<=x)aaa/g, '!'); // vrátí 'x!'
A existuje také negativní přehled dozadu
- (?<! ). V následujícím příkladu dojde
k nahrazení, pouze pokud před 'aaa'
není 'x':
'baaa'.replace(/(?<!x)aaa/g, '!'); // vrátí 'b!'
Praktické úlohy
Je dán řetězec obsahující názvy funkcí:
let str = 'func1() func2() func3()';
Získejte pole názvů funkcí z řetězce.
Je dán řetězec s tagem:
let str = '<a href="" class="eee" id="zzz">';
Získejte pole názvů atributů tohoto tagu.
Je dán řetězec s proměnnými:
let str = '$aaa $bbb $ccc xxxx';
Získejte podřetězce, před kterými je znak dolaru.