Pozitīvā un negatīvā aplūkošana JavaScript regulārajās izteiksmēs
Dažreiz ir jāatrisina šāda veida uzdevums: atrast
virkni 'aaa' un aizstāt to ar '!',
bet tikai tad, ja aiz 'aaa' atrodas
'x', bet pašu 'x' tajā pašā laikā
neaizstāj. Ja mēs mēģināsim atrisināt uzdevumu
'tieši', mums nekas neizdosies:
'aaax baaa'.replace(/aaax/g, '!'); // atgriezīs '! baaa', bet vēlējāmies '!x baaa'
Aplūkošana uz priekšu
Lai atrisinātu uzdevumu, ir nepieciešams veids, kā pateikt,
ka 'x' nevajadzētu aizstāt. Tas tiek darīts
ar speciālo iekavu (?= ) palīdzību,
kas tikai skatās, bet nepaņem līdzi.
Šīs iekavas sauc par pozitīvo aplūkošanu
uz priekšu. Pozitīvs - jo 'x'
(mūsu gadījumā) ir jāatrodas - tikai tad
notiks aizstāšana.
Izmantosim šīs iekavas, lai atrisinātu mūsu uzdevumu:
'aaax aaab'.replace(/aaa(?=x)/g, '!'); // atgriezīs '!x aaab'
Pastāv arī negatīvā aplūkošana uz priekšu
- (?! ) - tā, gluži pretēji, saka, ka
kaut kam nevajadzētu atrasties. Nākamajā piemērā
aizstāšana notiks tikai tad, ja aiz 'aaa'
atrodas NE 'x':
'aaax aaab'.replace(/aaa(?!x)/g, '!'); // atgriezīs 'aaax !b'
Aplūkošana atpakaļ
Līdzīgā veidā pastāv pozitīvā aplūkošana
atpakaļ - (?<= ). Nākamajā
piemērā aizstāšana notiks tikai tad, ja pirms
'aaa' atrodas 'x':
'xaaa'.replace(/(?<=x)aaa/g, '!'); // atgriezīs 'x!'
Un pastāv arī negatīvā aplūkošana atpakaļ
- (?<! ). Nākamajā piemērā aizstāšana
notiks tikai tad, ja pirms 'aaa'
neatrodas 'x':
'baaa'.replace(/(?<!x)aaa/g, '!'); // atgriezīs 'b!'
Praktiskie uzdevumi
Dota virkne, kas satur funkciju nosaukumus:
let str = 'func1() func2() func3()';
Iegūstiet masīvu ar funkciju nosaukumiem no virknes.
Dota virkne ar tagu:
let str = '<a href="" class="eee" id="zzz">';
Iegūstiet masīvu ar šī taga atribūtu nosaukumiem.
Dota virkne ar mainīgajiem:
let str = '$aaa $bbb $ccc xxxx';
Iegūstiet apakšvirknes, pirms kurām atrodas dolāra zīme.