Pozitivno in negativno napovedovanje v regularnih izrazih JavaScript

Včasih je treba rešiti nalogo te vrste: najti niz 'aaa' in ga zamenjati z '!', vendar le, če je za 'aaa' 'x', samega 'x' pa ne zamenjati. Če poskušamo rešiti nalogo 'neposredno', nam ne bo uspelo:

javascript'aaax baaa'.replace(/aaax/g, '!'); // vrne '! baaa', želeli pa smo '!x baaa'

Napovedovanje naprej

Za rešitev naloge potrebujemo način, da povemo, da 'x' ne smemo zamenjati. To naredimo s pomočjo posebnih oklepajev (?= ), ki samo gledajo, vendar ne zajamejo s seboj.

Ti oklepaji se imenujejo pozitivno napovedovanje naprej. Pozitivno - ker mora biti 'x' (v našem primeru) prisotno - šele takrat se bo zamenjava zgodila.

Uporabimo te oklepaje za rešitev naše naloge:

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

Obstaja tudi negativno napovedovanje naprej - (?! ) - ki, nasprotno, pravi, da nečesa ne sme biti. V naslednjem primeru se bo zamenjava zgodila le, če za 'aaa' ni 'x':

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

Napovedovanje nazaj

Podobno obstaja pozitivno napovedovanje nazaj - (?<= ). V naslednjem primeru se bo zamenjava zgodila le, če je pred 'aaa' 'x':

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

Obstaja pa tudi negativno napovedovanje nazaj - (?<! ). V naslednjem primeru se bo zamenjava zgodila le, če pred 'aaa' ni 'x':

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

Praktične naloge

Задание 1

Podan je niz, ki vsebuje imena funkcij:

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

Pridobite seznam imen funkcij iz niza.

Задание 2

Podan je niz z oznako:

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

Pridobite seznam imen atributov te oznake.

Задание 3

Podan je niz s spremenljivkami:

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

Pridobite podnize, pred katerimi je znak dolarja.