Escaping Special Characters in JavaScript Regular Expressions
Predpostavimo, da želimo, da poseben znak predstavlja samega sebe. Za to ga je potrebno escapirati z uporabo poševnice nazaj. Poglejmo si primere.
Primer
V naslednjem primeru je avtor regularnega izraza želel,
da bi vzorec iskanja izgledal takole: črka
'a', nato plus '+', nato
črka 'x'. Vendar avtor kode
ni escapiral znaka '+', zato
vzorec iskanja dejansko izgleda takole:
črka 'a' enkrat ali večkrat, potem
črka 'x':
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
Kot rezultat se bo v spremenljivko zapisalo naslednje:
'a+x ! ! !'
Primer
V tem primeru je avtor escapiral plus z
poševnico nazaj. Zdaj vzorec iskanja izgleda
tako, kot bi moral: črka 'a', nato plus
'+', nato črka 'x'.
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
Kot rezultat se bo v spremenljivko zapisalo naslednje:
'! ax aax aaax'
Primer
V tem primeru vzorec izgleda takole: črka
'a', nato pika '.', nato
črka 'x':
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
Kot rezultat se bo v spremenljivko zapisalo naslednje:
'! abx azx'
Primer
V naslednjem primeru je avtor pozabil escapirati piko in so bile z regularnim izrazom zajete vse podnize, saj neescapirana pika predstavlja poljuben znak:
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
Kot rezultat se bo v spremenljivko zapisalo naslednje:
'! ! !'
Opomba
Bodite pozorni, da če pozabite poševnico nazaj za piko (ko naj bi predstavljala samo sebe) - tega morda sploh ne boste opazili:
'a.x'.replace(/a.x/g, '!'); // vrne '!', kot smo želeli
Vizualno deluje pravilno (saj pika
predstavlja katerikoli znak, vključno z običajno
piko '.'). Toda če zamenjamo niz,
v katerem potekajo zamenjave - bomo videli našo
napako:
'a.x abx azx'.replace(/a.x/g, '!'); // vrne '! ! !', pričakovali pa smo '! abx azx'
Seznam posebnih in običajnih simbolov
Če escapirate običajen znak - se ne bo nič hudega zgodilo - še vedno bo predstavljal samega sebe. Izjema so številke, teh ni mogoče escapirati.
Pogosto se pojavi dvom, ali je določen znak poseben. Nekateri celo escapiramo vs sumljive znake zaporedoma. Vendar je to slaba praksa (zamaši regularni izraz s poševnicami nazaj).
Posebni znaki so: $ ^ . * + ? \
/ {} [] () |
Niso posebni znaki: @ : , ' " ;
- _ = < > % # ~ `& !
Praktične naloge
Podan je niz:
let str = 'a.a aba aea';
Napišite regularni izraz, ki bo našel niz
'a.a', ne da bi zajel ostale.
Podan je niz:
let str = '2+3 223 2223';
Napišite regularni izraz, ki bo našel niz
'2+3', ne da bi zajel ostale.
Podan je niz:
let str = '23 2+3 2++3 2+++3 345 567';
Napišite regularni izraz, ki bo našel nize
'2+3', '2++3', '2+++3',
ne da bi zajel ostale (+ je lahko poljubno
število).
Podan je niz:
let str = '23 2+3 2++3 2+++3 445 677';
Napišite regularni izraz, ki bo našel nize
'23', '2+3', '2++3',
'2+++3', ne da bi zajel ostale.
Podan je niz:
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
Napišite regularni izraz, ki bo našel nize
'*q+', '*qq+', '*qqq+',
ne da bi zajel ostale.
Podan je niz:
let str = '[abc] {abc} abc (abc) [abc]';
Napišite regularni izraz, ki bo našel nize
v oglatih oklepajih in jih zamenjal z '!'.