Escaparea caracterelor speciale în expresiile regulate JavaScript
Să presupunem că vrem să facem ca un caracter special să reprezinte el însuși. Pentru aceasta acesta trebuie escapat folosind backslash-ul. Să vedem câteva exemple.
Exemplul
În următorul exemplu, autorul expresiei regulate a vrut
ca modelul de căutare să arate astfel: litera
'a', apoi plus '+', apoi
litera 'x'. Cu toate acestea, autorul codului
nu a escapat simbolul '+' și de aceea
modelul de căutare arată de fapt astfel:
litera 'a' de una sau mai multe ori, apoi
litera 'x':
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
Ca rezultat, în variabilă se va scrie următorul text:
'a+x ! ! !'
Exemplul
Acum autorul a escapat plusul cu backslash.
Acum modelul de căutare arată așa cum trebuie: litera
'a', apoi plus '+', apoi litera 'x'.
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
Ca rezultat, în variabilă se va scrie următorul text:
'! ax aax aaax'
Exemplul
În acest exemplu, modelul arată astfel: litera
'a', apoi punctul '.', apoi
litera 'x':
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
Ca rezultat, în variabilă se va scrie următorul text:
'! abx azx'
Exemplul
În următorul exemplu, autorul a uitat să escape slash-ul și sub expresia regulată au căzut toate subșirurile, deoarece punctul neescapat reprezintă orice caracter:
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
Ca rezultat, în variabilă se va scrie următorul text:
'! ! !'
Observație
Atenție la faptul că dacă uitați backslash-ul pentru punct (când acesta ar trebui să reprezinte el însuși) - acest lucru s-ar putea să nu fie observat:
'a.x'.replace(/a.x/g, '!'); // va returna '!', așa cum am vrut
Vizual funcționează corect (deoarece punctul
reprezintă orice caracter, inclusiv un punct obișnuit
'.'). Dar dacă schimbăm șirul
în care se fac înlocuirile - vom vedea greșeala noastră:
'a.x abx azx'.replace(/a.x/g, '!'); // va returna '! ! !', dar se aștepta '! abx azx'
Lista caracterelor speciale și a celor obișnuite
Dacă escapați un caracter obișnuit - nu se va întâmpla nimic rău - acesta va reprezenta oricum el însuși. Excepție - cifrele, acestea nu pot fi escapare.
Deseori apare îndoiala dacă un anumit simbol este special. Unii ajung să escapeze toate caracterele suspecte la rând. Cu toate acestea, aceasta este o practică proastă (încarcă expresia regulată cu backslash-uri).
Sunt caractere speciale: $ ^ . * + ? \
/ {} [] () |
Nu sunt caractere speciale: @ : , ' " ;
- _ = < > % # ~ `& !
Probleme practice
Este dat șirul:
let str = 'a.a aba aea';
Scrieți o expresie regulată care va găsi șirul
'a.a', fără a-l prinde pe celelalte.
Este dat șirul:
let str = '2+3 223 2223';
Scrieți o expresie regulată care va găsi șirul
'2+3', fără a-l prinde pe celelalte.
Este dat șirul:
let str = '23 2+3 2++3 2+++3 345 567';
Scrieți o expresie regulată care va găsi șirurile
'2+3', '2++3', '2+++3',
fără a le prinde pe celelalte (+ poate fi orice
număr).
Este dat șirul:
let str = '23 2+3 2++3 2+++3 445 677';
Scrieți o expresie regulată care va găsi șirurile
'23', '2+3', '2++3',
'2+++3', fără a le prinde pe celelalte.
Este dat șirul:
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
Scrieți o expresie regulată care va găsi șirurile
'*q+', '*qq+', '*qqq+',
fără a le prinde pe celelalte.
Este dat șirul:
let str = '[abc] {abc} abc (abc) [abc]';
Scrieți o expresie regulată care va găsi șirurile
în paranteze pătrate și le va înlocui cu '!'.