Pozitivni i negativni pregled (lookahead i lookbehind) u JavaScript regularnim izrazima
Ponekad je potrebno rešiti problem ovog tipa: naći
string 'aaa' i zameniti ga sa '!',
ali samo ako se posle 'aaa' nalazi
'x', a sam 'x' pritom
ne zameniti. Ako pokušamo da rešimo problem
'direktno', nećemo uspeti:
'aaax baaa'.replace(/aaax/g, '!'); // vratiće '! baaa', a hteli smo '!x baaa'
Pregled unapred (lookahead)
Za rešavanje ovog problema potreban je način da se kaže
da 'x' ne treba zameniti. To se radi
pomoću specijalnih zagrada (?= ),
koje samo proveravaju (gledaju), ali ne uzimaju deo stringa.
Ove zagrade se zovu pozitivan pregled unapred
(positive lookahead). Pozitivan - jer 'x'
(u našem slučaju) mora da postoji - samo tada će
doći do zamene.
Hajde da primenimo ove zagrade da rešimo naš problem:
'aaax aaab'.replace(/aaa(?=x)/g, '!'); // vratiće '!x aaab'
Postoji i negativan pregled unapred (negative lookahead)
- (?! ) - on, suprotno, govori da
nečega ne sme biti. U sledećem primeru,
zamena će se desiti, samo ako se posle 'aaa'
ne nalazi 'x':
'aaax aaab'.replace(/aaa(?!x)/g, '!'); // vratiće 'aaax !b'
Pregled unazad (lookbehind)
Analogno, postoji pozitivan pregled unazad
(positive lookbehind) - (?<= ). U sledećem
primeru zamena će se desiti, samo ako se ispred
'aaa' nalazi 'x':
'xaaa'.replace(/(?<=x)aaa/g, '!'); // vratiće 'x!'
Postoji i negativan pregled unazad (negative lookbehind)
- (?<! ). U sledećem primeru zamena
će se desiti, samo ako se ispred 'aaa'
ne nalazi 'x':
'baaa'.replace(/(?<!x)aaa/g, '!'); // vratiće 'b!'
Praktični zadaci
Dat je string koji sadrži imena funkcija:
let str = 'func1() func2() func3()';
Dobijte niz imena funkcija iz stringa.
Dat je string sa HTML tagom:
let str = '<a href="" class="eee" id="zzz">';
Dobijte niz imena atributa ovog taga.
Dat je string sa promenljivima:
let str = '$aaa $bbb $ccc xxxx';
Dobijte podstringove ispred kojih se nalazi znak dolara.