Positiivinen ja negatiivinen etsintä JavaScriptin säännöllisissä lausekkeissa
Joskus on ratkaistava seuraavanlainen ongelma: etsi
merkkijono 'aaa' ja korvaa se merkkijonolla '!',
mutta vain jos 'aaa':n jälkeen on
'x', mutta itse 'x':ää ei tule
korvata. Jos yritämme ratkaista ongelman
'suoraan', se ei onnistu:
'aaax baaa'.replace(/aaax/g, '!'); // palauttaa '! baaa', haluttiin '!x baaa'
Etsintä eteenpäin
Ongelman ratkaisemiseksi tarvitaan tapa sanoa,
että 'x':ää ei tulisi korvata. Tämä tehdään
erikoisilla sulkeilla (?= ),
jotka vain etsivät, mutta eivät ota itseään mukaan.
Näitä sulkeita kutsutaan positiiviseksi etsinnäksi
eteenpäin. Positiivinen - koska 'x'
(meidän tapauksessamme) on oltava - vain silloin
korvaus tapahtuu.
Sovelletaan näitä sulkeita ongelmamme ratkaisemiseksi:
'aaax aaab'.replace(/aaa(?=x)/g, '!'); // palauttaa '!x aaab'
On olemassa myös negatiivinen etsintä eteenpäin
- (?! ) - se puolestaan sanoo, että
jotain ei pitäisi olla. Seuraavassa esimerkissä
korvaus tapahtuu vain, jos 'aaa':n jälkeen
ei ole 'x':
'aaax aaab'.replace(/aaa(?!x)/g, '!'); // palauttaa 'aaax !b'
Etsintä taaksepäin
Vastaavasti on olemassa positiivinen etsintä
taaksepäin - (?<= ). Seuraavassa
esimerkissä korvaus tapahtuu vain, jos
'aaa':n edessä on 'x':
'xaaa'.replace(/(?<=x)aaa/g, '!'); // palauttaa 'x!'
Ja on myös negatiivinen etsintä taaksepäin
- (?<! ). Seuraavassa esimerkissä korvaus
tapahtuu vain, jos 'aaa':n edessä
ei ole 'x':
'baaa'.replace(/(?<!x)aaa/g, '!'); // palauttaa 'b!'
Käytännön tehtävät
Annettu merkkijono, joka sisältää funktion nimiä:
let str = 'func1() func2() func3()';
Hanki taulukko funktioiden nimistä merkkijonosta.
Annettu merkkijono tagilla:
let str = '<a href="" class="eee" id="zzz">';
Hanki taulukko tämän tagin attribuuttien nimistä.
Annettu merkkijono muuttujilla:
let str = '$aaa $bbb $ccc xxxx';
Hanki merkkijonot, joiden edessä on dollarimerkki.