⊗jsSpRELAB 133 of 294 menu

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.

esruhysvuzc