Escaping special characters in JavaScript regular expressions
Pretpostavimo da želimo da učinimo da specijalni znak označava samog sebe. Za ovo potrebno ga je escapovati koristeći obrnutu kosu crtu. Pogledajmo na primerima.
Primer
U sledećem primeru autor regularnog izraza je želeo
da obrazac pretrage izgleda ovako: slovo
'a', zatim plus '+', zatim
slovo 'x'. Međutim, autor koda
nije escapovao znak '+' i stoga
obrazac pretrage zapravo izgleda ovako:
slovo 'a' jedan ili više puta, zatim
slovo 'x':
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
Kao rezultat, u promenljivu će biti upisano sledeće:
'a+x ! ! !'
Primer
A sada je autor escapovao plus obrnutom
kosom crtom. Sada obrazac pretrage izgleda kako
treba: slovo 'a', zatim plus
'+', zatim slovo 'x'.
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
Kao rezultat, u promenljivu će biti upisano sledeće:
'! ax aax aaax'
Primer
U ovom primeru obrazac izgleda ovako: slovo
'a', zatim tačka '.', zatim
slovo 'x':
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
Kao rezultat, u promenljivu će biti upisano sledeće:
'! abx azx'
Primer
U sledećem primeru autor je zaboravio da escapuje tačku i regularni izraz je uhvatio sve podniske, jer tačka koja nije escapovana označava bilo koji znak:
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
Kao rezultat, u promenljivu će biti upisano sledeće:
'! ! !'
Napomena
Obratite pažnju na to da ako zaboravite obrnutu kosu crtu za tačku (kada ona treba da označava samu sebe) - to se možda čak neće primetiti:
'a.x'.replace(/a.x/g, '!'); // vraća '!', kako smo i hteli
Vizuelno radi ispravno (pošto tačka
označava bilo koji znak, uključujući i običnu
tačku '.'). Ali ako promenimo nisku
u kojoj se vrše zamene - videćemo našu
grešku:
'a.x abx azx'.replace(/a.x/g, '!'); // vraća '! ! !', a očekivalo se '! abx azx'
Lista specijalnih znakova i običnih
Ako escapujete običan znak - ništa strašno se neće desiti - on će i dalje označavati samog sebe. Izuzetak su cifre, one se ne mogu escapovati.
Često se postavlja pitanje, da li je dati znak specijalan. Neki idu dotle da escapuju sve sumnjive znakove jedan za drugim. Međutim, to je loša praksa (zasipa regularni izraz obrnutim kosim crtama).
Specijalni znakovi su: $ ^ . * + ? \
/ {} [] () |
Nisu specijalni znakovi: @ : , ' " ;
- _ = < > % # ~ `& !
Praktični zadaci
Data je niska:
let str = 'a.a aba aea';
Napišite regularni izraz koji će pronaći nisku
'a.a', ne uhvativši ostale.
Data je niska:
let str = '2+3 223 2223';
Napišite regularni izraz koji će pronaći nisku
'2+3', ne uhvativši ostale.
Data je niska:
let str = '23 2+3 2++3 2+++3 345 567';
Napišite regularni izraz koji će pronaći niske
'2+3', '2++3', '2+++3',
ne uhvativši ostale (+ može biti bilo koja
količina).
Data je niska:
let str = '23 2+3 2++3 2+++3 445 677';
Napišite regularni izraz koji će pronaći niske
'23', '2+3', '2++3',
'2+++3', ne uhvativši ostale.
Data je niska:
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
Napišite regularni izraz koji će pronaći niske
'*q+', '*qq+', '*qqq+',
ne uhvativši ostale.
Data je niska:
let str = '[abc] {abc} abc (abc) [abc]';
Napišite regularni izraz koji će pronaći niske
u uglastim zagradama i zameniti ih sa '!'.