Escaping av spesialtegn i JavaScript regex
Anta at vi ønsker at et spesialtegn skal representere seg selv. For å gjøre dette må det escapes med en omvendt skråstrek. La oss se på noen eksempler.
Eksempel
I det følgende eksempelet ønsket forfatteren av regexet
at søkemønsteret skulle se slik ut: bokstaven
'a', deretter plusstegn '+', deretter
bokstaven 'x'. Imidlertid, så escapes ikke
forfatteren av koden tegnet '+', og derfor
ser søkemønsteret faktisk slik ut:
bokstaven 'a' en eller flere ganger, deretter
bokstaven 'x':
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
Resultatet som skrives til variabelen blir følgende:
'a+x ! ! !'
Eksempel
Nå har forfatteren escapes plusstegnet med en omvendt
skråstrek. Nå ser søkemønsteret slik ut,
som det skal: bokstaven 'a', deretter plusstegn
'+', deretter bokstaven 'x'.
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
Resultatet som skrives til variabelen blir følgende:
'! ax aax aaax'
Eksempel
I dette eksempelet ser mønsteret slik ut: bokstaven
'a', deretter punktum '.', deretter
bokstaven 'x':
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
Resultatet som skrives til variabelen blir følgende:
'! abx azx'
Eksempel
I det følgende eksempelet glemte forfatteren å escape skråstreken, og alle delstrenger ble fanget opp av regexet, fordi en u-escapes punktum representerer et hvilket som helst tegn:
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
Resultatet som skrives til variabelen blir følgende:
'! ! !'
Merknad
Vær oppmerksom på at hvis du glemmer den omvendte skråstreken for punktum (når det skal representere seg selv) - så kan dette være vanskelig å legge merke til:
'a.x'.replace(/a.x/g, '!'); // returnerer '!', som vi ønsket
Visuelt fungerer det riktig (fordi punktum
representerer et hvilket som helst tegn, inkludert et vanlig
punktum '.'). Men hvis vi endrer strengen
der erstatningene skjer - vil vi se feilen vår:
'a.x abx azx'.replace(/a.x/g, '!'); // returnerer '! ! !', mens forventet var '! abx azx'
Liste over spesialtegn og vanlige tegn
Hvis du escape et vanlig tegn - så skjer det ingenting alvorlig - det vil fortsatt representere seg selv. Unntaket er sifre, de kan ikke escapes.
Ofte oppstår det tvil om et gitt tegn er spesialtegn eller ikke. Noen kommer så langt som å escape alle mistenkelige tegn på rad. Dette er imidlertid dårlig praksis (laster regexet med omvendte skråstreker).
Følgende er spesialtegn: $ ^ . * + ? \
/ {} [] () |
Følgende er ikke spesialtegn: @ : , ' " ;
- _ = < > % # ~ `& !
Praktiske oppgaver
Gitt følgende streng:
let str = 'a.a aba aea';
Skriv et regex som finner strengen
'a.a', uten å fange opp de andre.
Gitt følgende streng:
let str = '2+3 223 2223';
Skriv et regex som finner strengen
'2+3', uten å fange opp de andre.
Gitt følgende streng:
let str = '23 2+3 2++3 2+++3 345 567';
Skriv et regex som finner strengene
'2+3', '2++3', '2+++3',
uten å fange opp de andre (+ kan være et hvilket som helst
antall).
Gitt følgende streng:
let str = '23 2+3 2++3 2+++3 445 677';
Skriv et regex som finner strengene
'23', '2+3', '2++3',
'2+++3', uten å fange opp de andre.
Gitt følgende streng:
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
Skriv et regex som finner strengene
'*q+', '*qq+', '*qqq+',
uten å fange opp de andre.
Gitt følgende streng:
let str = '[abc] {abc} abc (abc) [abc]';
Skriv et regex som finner strengene
i klammeparenteser og erstatter dem med '!'.