Erikoismerkkien escapaus JavaScriptin säännöllisissä lausekkeissa
Oletetaan, että haluamme tehdä niin, että erikoismerkki tarkoittaa itseään. Tätä varten sitä täytyy escapata kenoviivalla. Katsotaanpa esimerkein.
Esimerkki
Seuraavassa esimerkissä säännöllisen lausekkeen tekijä halusi,
että hakumalli näyttäisi tältä: kirjain
'a', sitten plus '+', sitten
kirjain 'x'. Kuitenkin, koodin tekijä
ei escapannut merkkiä '+' ja siksi
hakumalli itse asiassa näyttää tältä:
kirjain 'a' yksi tai useampi kerta, sitten
kirjain 'x':
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
Tuloksena muuttujaan kirjoitetaan seuraava:
'a+x ! ! !'
Esimerkki
Mutta nyt tekijä on escapannut plus-merkin kenoviivalla.
Nyt hakumalli näyttää siltä kuin pitääkin: kirjain
'a', sitten plus '+', sitten kirjain
'x'.
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
Tuloksena muuttujaan kirjoitetaan seuraava:
'! ax aax aaax'
Esimerkki
Tässä esimerkissä hakumalli näyttää tältä: kirjain
'a', sitten piste '.', sitten
kirjain 'x':
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
Tuloksena muuttujaan kirjoitetaan seuraava:
'! abx azx'
Esimerkki
Seuraavassa esimerkissä tekijä unohti escapata pisteen ja säännöllinen lauseke löysi kaikki alimerkkijonot, koska escapaaamaton piste tarkoittaa mitä tahansa merkkiä:
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
Tuloksena muuttujaan kirjoitetaan seuraava:
'! ! !'
Huomautus
Huomaa, että jos unohdat kenoviivan pisteelle (kun sen pitäisi tarkoittaa itseään) - tätä ei välttämättä edes huomaa:
'a.x'.replace(/a.x/g, '!'); // palauttaa '!', kuten halusimmekin
Visuaalisesti se toimii oikein (koska piste
tarkoittaa mitä tahansa merkkiä, myös tavallista
pistettä '.'). Mutta jos muutetaan merkkijonoa,
jossa korvaukset tapahtuvat - näemme virheemme:
'a.x abx azx'.replace(/a.x/g, '!'); // palauttaa '! ! !', odotettiin '! abx azx'
Erikoismerkkien ja tavallisten merkkien lista
Jos escapaa tavallisen merkin - mitään kamalaa ei tapahdu - se tarkoittaa silti itseään. Poikkeus - numerot, niitä ei voi escapata.
Usein herää epäilys, onko tietty merkki erikoinen. Jotkut menevät siihen pisteeseen että escapavat kaikki epäilyttävät merkit peräkkäin. Tämä on kuitenkin huono käytäntö (täyttää säännöllisen lausekkenen kenoviivoilla).
Ovat erikoismerkkejä: $ ^ . * + ? \
/ {} [] () |
Eivät ole erikoismerkkejä: @ : , ' " ;
- _ = < > % # ~ `& !
Käytännön tehtävät
Annettu merkkijono:
let str = 'a.a aba aea';
Kirjoita säännöllinen lauseke, joka löytää merkkijonon
'a.a', ottaen muita.
Annettu merkkijono:
let str = '2+3 223 2223';
Kirjoita säännöllinen lauseke, joka löytää merkkijonon
'2+3', ottaen muita.
Annettu merkkijono:
let str = '23 2+3 2++3 2+++3 345 567';
Kirjoita säännöllinen lauseke, joka löytää merkkijonot
'2+3', '2++3', '2+++3',
ottaen muita (+ voi olla mikä tahansa
määrä).
Annettu merkkijono:
let str = '23 2+3 2++3 2+++3 445 677';
Kirjoita säännöllinen lauseke, joka löytää merkkijonot
'23', '2+3', '2++3',
'2+++3', ottaen muita.
Annettu merkkijono:
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
Kirjoita säännöllinen lauseke, joka löytää merkkijonot
'*q+', '*qq+', '*qqq+',
ottaen muita.
Annettu merkkijono:
let str = '[abc] {abc} abc (abc) [abc]';
Kirjoita säännöllinen lauseke, joka löytää merkkijonot
hakasulkeissa ja korvaa ne '!':lla.