Positiivne ja negatiivne ettevaade JavaScripti regulaaravaldistes
Mõnikord on vaja lahendada sellist tüüpi ülesanne: leida
string 'aaa' ja asendada see '!'-ga,
kuid ainult siis, kui 'aaa' järel on
'x', kuid 'x' ise ei tohi
asendada. Kui me proovime lahendada ülesannet
'täitsa otse', siis meil ei õnnestu:
'aaax baaa'.replace(/aaax/g, '!'); // tagastab '! baaa', kuid sooviti '!x baaa'
Ettevaade edasi
Ülesande lahendamiseks on vaja viisi öelda,
et 'x' ei tohiks asendada. Seda tehakse
spetsiaalsete sulgude abil (?= ),
mis lihtsalt vaatavad, kuid ei võta endaga kaasa.
Neid sulgusid nimetatakse positiivseks ettevaateks
edasi. Positiivne - kuna 'x'
(meie puhul) peab olema - alles siis
toimub asendamine.
Rakendame neid sulgusid meie ülesande lahendamiseks:
'aaax aaab'.replace(/aaa(?=x)/g, '!'); // tagastab '!x aaab'
On olemas ka negatiivne ettevaade edasi
- (?! ) - see, vastupidi, ütleb, et
midagi ei peaks olema. Järgmises näites
toimub asendamine ainult siis, kui 'aaa'
järel ei ole 'x':
'aaax aaab'.replace(/aaa(?!x)/g, '!'); // tagastab 'aaax !b'
Ettevaade tagasi
Samamoodi on olemas positiivne ettevaade
tagasi - (?<= ). Järgmises
näites toimub asendamine ainult siis, kui
'aaa' ees on 'x':
'xaaa'.replace(/(?<=x)aaa/g, '!'); // tagastab 'x!'
Ja on ka negatiivne ettevaade tagasi
- (?<! ). Järgmises näites toimub asendamine
ainult siis, kui 'aaa'
eel ei ole 'x':
'baaa'.replace(/(?<!x)aaa/g, '!'); // tagastab 'b!'
Praktilised ülesanded
Antud on string, mis sisaldab funktsioonide nimesid:
let str = 'func1() func2() func3()';
Hankige stringist funktsioonide nimede massiiv.
Antud on stringiga silt:
let str = '<a href="" class="eee" id="zzz">';
Hankige selle sildi atribuutide nimede massiiv.
Antud on string muutujatega:
let str = '$aaa $bbb $ccc xxxx';
Hankige alamstringid, mille ees on dollari sümbol.