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:
'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:
'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':
'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':
'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':
'baaa'.replace(/(?<!x)aaa/g, '!'); // vrne 'b!'
Praktične naloge
Podan je niz, ki vsebuje imena funkcij:
let str = 'func1() func2() func3()';
Pridobite seznam imen funkcij iz niza.
Podan je niz z oznako:
let str = '<a href="" class="eee" id="zzz">';
Pridobite seznam imen atributov te oznake.
Podan je niz s spremenljivkami:
let str = '$aaa $bbb $ccc xxxx';
Pridobite podnize, pred katerimi je znak dolarja.