Екраниране на специални символи в регулярни изрази в JavaScript
Да предположим, че искаме да направим така, че специален символ да означава себе си. За целта той трябва да бъде екраниран с помощта на обратна наклонена черта. Нека да разгледаме примери.
Пример
В следващия пример авторът на регулярния израз искаше
шаблонът за търсене да изглежда така: буква
'a', следван от плюс '+', следван от
буква 'x'. Обаче, авторът на кода
не е екранирал символа '+' и затова
шаблонът за търсене всъщност изглежда така:
буква 'a' един или повече пъти, след това
буква 'x':
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
В резултат в променливата ще бъде записано следното:
'a+x ! ! !'
Пример
А сега авторът е екранирал плюса с обратна
наклонена черта. Сега шаблонът за търсене изглежда така,
както трябва: буква 'a', следван от плюс
'+', следван от буква 'x'.
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
В резултат в променливата ще бъде записано следното:
'! ax aax aaax'
Пример
В този пример шаблонът изглежда така: буква
'a', следван от точка '.', следван
от буква 'x':
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
В резултат в променливата ще бъде записано следното:
'! abx azx'
Пример
В следващия пример авторът забрави да екранира точката и под регулярния израз попаднаха всички поднизове, тъй като неекранираната точка означава всякакъв символ:
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
В резултат в променливата ще бъде записано следното:
'! ! !'
Забележка
Обърнете внимание, че ако забравите обратната наклонена черта за точката (когато тя трябва да означава сама себе си) - това може дори да не се забележи:
'a.x'.replace(/a.x/g, '!'); // ще върне '!', както сме искали
Визуално работи правилно (тъй като точката
означава всякакъв символ, включително и обикновена
точка '.'). Но ако променим низа,
в който се извършват замените - ще видим нашата
грешка:
'a.x abx azx'.replace(/a.x/g, '!'); // ще върне '! ! !', а се очакваше '! abx azx'
Списък на специални и обикновени символи
Ако екранирате обикновен символ - нищо лошо няма да се случи - той все пак ще означава себе си. Изключение - цифрите, те не могат да бъдат екранирани.
Често възниква съмнение дали даден символ е специален. Някои хора стигат дотам, че екранират всички подозрителни символи един след друг. Това обаче е лоша практика (запълва регулярния израз с обратни наклонени черти).
Специални символи са: $ ^ . * + ? \
/ {} [] () |
Не са специални символи: @ : , ' " ;
- _ = < > % # ~ `& !
Практически задачи
Даден е низ:
let str = 'a.a aba aea';
Напишете регулярен израз, който ще намери низа
'a.a', без да улавя останалите.
Даден е низ:
let str = '2+3 223 2223';
Напишете регулярен израз, който ще намери низа
'2+3', без да улавя останалите.
Даден е низ:
let str = '23 2+3 2++3 2+++3 345 567';
Напишете регулярен израз, който ще намери низовете
'2+3', '2++3', '2+++3',
без да улавя останалите (+ може да бъде произволен
брой).
Даден е низ:
let str = '23 2+3 2++3 2+++3 445 677';
Напишете регулярен израз, който ще намери низовете
'23', '2+3', '2++3',
'2+++3', без да улавя останалите.
Даден е низ:
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
Напишете регулярен израз, който ще намери низовете
'*q+', '*qq+', '*qqq+',
без да улавя останалите.
Даден е низ:
let str = '[abc] {abc} abc (abc) [abc]';
Напишете регулярен израз, който ще намери низовете
в квадратни скоби и ще ги замени с '!'.