Escaping af specialtegn i JavaScript regulære udtryk
Antag, at vi ønsker at gøre så et specialtegn repræsenterer sig selv. For at gøre dette skal det escapes med en omvendt skråstreg. Lad os se på eksempler.
Eksempel
I det følgende eksempel ønskede forfatteren af det regulære udtryk,
at søgemønstret skulle se sådan ud: bogstavet
'a', derefter plus '+', derefter
bogstavet 'x'. Imidlertid escapede kodeforfatteren
ikke tegnet '+', og derfor
ser søgemønstret faktisk sådan ud:
bogstavet 'a' en eller flere gange, derefter
bogstavet 'x':
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
Resultatet bliver, at der skrives følgende til variablen:
'a+x ! ! !'
Eksempel
I dette eksempel har forfatteren nu escaped plustegnet med en omvendt
skråstreg. Nu ser søgemønstret ud som det skal: bogstavet
'a', derefter plus '+', derefter bogstavet 'x'.
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
Resultatet bliver, at der skrives følgende til variablen:
'! ax aax aaax'
Eksempel
I dette eksempel ser mønstret sådan ud: bogstavet
'a', derefter punktum '.', derefter
bogstavet 'x':
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
Resultatet bliver, at der skrives følgende til variablen:
'! abx azx'
Eksempel
I det følgende eksempel glemte forfatteren at escape skråstregen, og alle delstrenge blev ramt af det regulære udtryk, da en u-escaped punktum repræsenterer ethvert tegn:
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
Resultatet bliver, at der skrives følgende til variablen:
'! ! !'
Bemærkning
Læg mærke til, at hvis du glemmer den omvendte skråstreg for punktum (når den skal repræsentere sig selv) - kan det være man slet ikke lægger mærke til det:
'a.x'.replace(/a.x/g, '!'); // returnerer '!', som vi ønskede
Visuelt fungerer det korrekt (da punktum
repræsenterer ethvert tegn, inklusive et almindeligt
punktum '.'). Men hvis man ændrer strengen,
hvor erstatningerne foretages - vil vi se vores
fejl:
'a.x abx azx'.replace(/a.x/g, '!'); // returnerer '! ! !', men forventet var '! abx azx'
Liste over specialtegn og almindelige tegn
Hvis man escape et almindeligt tegn - sker der ikke noget forskrekkeligt - det vil stadig repræsentere sig selv. Undtagelsen er cifre, de kan ikke escapes.
Ofte opstår der tvivl om, hvorvidt et givet tegn er et specialtegn. Nogle kommer så langt som at escape alle mistænkelige tegn i træk. Dette er dog en dårlig praksis (roder det regulære udtryk til med omvendte skråstreger).
Følgende er specialtegn: $ ^ . * + ? \
/ {} [] () |
Følgende er ikke specialtegn: @ : , ' " ;
- _ = < > % # ~ `& !
Praktiske opgaver
Givet strengen:
let str = 'a.a aba aea';
Skriv et regulært udtryk, der finder strengen
'a.a', uden at fange de andre.
Givet strengen:
let str = '2+3 223 2223';
Skriv et regulært udtryk, der finder strengen
'2+3', uden at fange de andre.
Givet strengen:
let str = '23 2+3 2++3 2+++3 345 567';
Skriv et regulært udtryk, der finder strengene
'2+3', '2++3', '2+++3',
uden at fange de andre (+ kan være et vilkårligt
antal).
Givet strengen:
let str = '23 2+3 2++3 2+++3 445 677';
Skriv et regulært udtryk, der finder strengene
'23', '2+3', '2++3',
'2+++3', uden at fange de andre.
Givet strengen:
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
Skriv et regulært udtryk, der finder strengene
'*q+', '*qq+', '*qqq+',
uden at fange de andre.
Givet strengen:
let str = '[abc] {abc} abc (abc) [abc]';
Skriv et regulært udtryk, der finder strengene
i kantede parenteser og erstatter dem med '!'.