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':

javascriptlet str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');

Kot rezultat se bo v spremenljivko zapisalo naslednje:

javascript'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'.

javascriptlet str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');

Kot rezultat se bo v spremenljivko zapisalo naslednje:

javascript'! ax aax aaax'

Primer

V tem primeru vzorec izgleda takole: črka 'a', nato pika '.', nato črka 'x':

javascriptlet str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');

Kot rezultat se bo v spremenljivko zapisalo naslednje:

javascript'! 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:

javascriptlet str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');

Kot rezultat se bo v spremenljivko zapisalo naslednje:

javascript'! ! !'

Opomba

Bodite pozorni, da če pozabite poševnico nazaj za piko (ko naj bi predstavljala samo sebe) - tega morda sploh ne boste opazili:

javascript'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:

javascript'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

Задание 1

Podan je niz:

javascriptlet str = 'a.a aba aea';

Napišite regularni izraz, ki bo našel niz 'a.a', ne da bi zajel ostale.

Задание 2

Podan je niz:

javascriptlet str = '2+3 223 2223';

Napišite regularni izraz, ki bo našel niz '2+3', ne da bi zajel ostale.

Задание 3

Podan je niz:

javascriptlet 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).

Задание 4

Podan je niz:

javascriptlet 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.

Задание 5

Podan je niz:

javascriptlet str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';

Napišite regularni izraz, ki bo našel nize '*q+', '*qq+', '*qqq+', ne da bi zajel ostale.

Задание 6

Podan je niz:

javascriptlet str = '[abc] {abc} abc (abc) [abc]';

Napišite regularni izraz, ki bo našel nize v oglatih oklepajih in jih zamenjal z '!'.