Экранiроўка спецсімвалаў у рэгулярках 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]';
Напішыце рэгулярку, якая знойдзе радкі
у квадратных дужках і замяніць іх на '!'.