Escapování speciálních znaků v regulárních výrazech JavaScriptu
Předpokládejme, že chceme, aby speciální znak představoval sám sebe. K tomu je třeba jej escapovat pomocí zpětného lomítka. Podívejme se na příkladech.
Příklad
V následujícím příkladu autor regulárního výrazu chtěl,
aby vyhledávací vzor vypadal takto: písmeno
'a', poté plus '+', poté
písmeno 'x'. Avšak autor kódu
neescapoval symbol '+', a proto
ve skutečnosti vyhledávací vzor vypadá takto:
písmeno 'a' jedno nebo vícekrát, poté
písmeno 'x':
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
Výsledek zapsaný do proměnné bude následující:
'a+x ! ! !'
Příklad
Nyní autor escapoval plus zpětným
lomítkem. Nyní vyhledávací vzor vypadá tak,
jak má: písmeno 'a', poté plus
'+', poté písmeno 'x'.
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
Výsledek zapsaný do proměnné bude následující:
'! ax aax aaax'
Příklad
V tomto příkladu vzor vypadá takto: písmeno
'a', poté tečka '.', poté
písmeno 'x':
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
Výsledek zapsaný do proměnné bude následující:
'! abx azx'
Příklad
V následujícím příkladu autor zapomněl escapovat lomítko a regulární výraz našel všechny podřetězce, protože neescapovaná tečka značí libovolný znak:
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
Výsledek zapsaný do proměnné bude následující:
'! ! !'
Poznámka
Všimněte si, že pokud zapomenete zpětné lomítko pro tečku (když má znamenat sama sebe) - nemusíte si toho ani všimnout:
'a.x'.replace(/a.x/g, '!'); // vrátí '!', jak jsme chtěli
Vizuálně to funguje správně (protože tečka
značí libovolný znak, včetně obyčejné
tečky '.'). Ale pokud změníme řetězec,
ve kterém se provádějí nahrazování - uvidíme naši
chybu:
'a.x abx azx'.replace(/a.x/g, '!'); // vrátí '! ! !', ale očekávalo se '! abx azx'
Seznam speciálních a obyčejných znaků
Pokud escapujete obyčejný znak - nic se nestane - bude stále znamenat sám sebe. Výjimkou jsou číslice, ty nelze escapovat.
Často vzniká pochybnost, zda je daný znak speciální. Někteří docházejí až k tomu, že escapují všechny podezřelé znaky postupně. To je však špatná praxe (zaneřádí regulární výraz zpětnými lomítky).
Speciálními znaky jsou: $ ^ . * + ? \
/ {} [] () |
Nejsou speciálními znaky: @ : , ' " ;
- _ = < > % # ~ `& !
Praktické úlohy
Je dán řetězec:
let str = 'a.a aba aea';
Napište regulární výraz, který najde řetězec
'a.a', a nezachytí ostatní.
Je dán řetězec:
let str = '2+3 223 2223';
Napište regulární výraz, který najde řetězec
'2+3', a nezachytí ostatní.
Je dán řetězec:
let str = '23 2+3 2++3 2+++3 345 567';
Napište regulární výraz, který najde řetězce
'2+3', '2++3', '2+++3',
a nezachytí ostatní (+ může být libovolný
počet).
Je dán řetězec:
let str = '23 2+3 2++3 2+++3 445 677';
Napište regulární výraz, který najde řetězce
'23', '2+3', '2++3',
'2+++3', a nezachytí ostatní.
Je dán řetězec:
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
Napište regulární výraz, který najde řetězce
'*q+', '*qq+', '*qqq+',
a nezachytí ostatní.
Je dán řetězec:
let str = '[abc] {abc} abc (abc) [abc]';
Napište regulární výraz, který najde řetězce
v hranatých závorkách a nahradí je '!'.