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':

javascriptlet str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');

Resultatet som skrives til variabelen blir følgende:

javascript'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'.

javascriptlet str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');

Resultatet som skrives til variabelen blir følgende:

javascript'! ax aax aaax'

Eksempel

I dette eksempelet ser mønsteret slik ut: bokstaven 'a', deretter punktum '.', deretter bokstaven 'x':

javascriptlet str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');

Resultatet som skrives til variabelen blir følgende:

javascript'! 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:

javascriptlet str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');

Resultatet som skrives til variabelen blir følgende:

javascript'! ! !'

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:

javascript'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:

javascript'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

Задание 1

Gitt følgende streng:

javascriptlet str = 'a.a aba aea';

Skriv et regex som finner strengen 'a.a', uten å fange opp de andre.

Задание 2

Gitt følgende streng:

javascriptlet str = '2+3 223 2223';

Skriv et regex som finner strengen '2+3', uten å fange opp de andre.

Задание 3

Gitt følgende streng:

javascriptlet 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).

Задание 4

Gitt følgende streng:

javascriptlet 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.

Задание 5

Gitt følgende streng:

javascriptlet str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';

Skriv et regex som finner strengene '*q+', '*qq+', '*qqq+', uten å fange opp de andre.

Задание 6

Gitt følgende streng:

javascriptlet str = '[abc] {abc} abc (abc) [abc]';

Skriv et regex som finner strengene i klammeparenteser og erstatter dem med '!'.