Escapning av specialtecken i JavaScript regex
Antag att vi vill göra så att ett specialtecken representerar sig självt. För att göra detta måste det escapnas med ett omvänt snedstreck. Låt oss titta på exempel.
Exempel
I följande exempel ville författaren till det reguljära uttrycket
att sökmönstret skulle se ut så här: bokstaven
'a', sedan ett plus '+', sedan
bokstaven 'x'. Men författaren till koden
escapade inte tecknet '+' och därför
ser sökmönstret faktiskt ut så här:
bokstaven 'a' en eller flera gånger, sedan
bokstaven 'x':
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
Resultatet som skrivs till variabeln blir följande:
'a+x ! ! !'
Exempel
I det här exemplet har författaren escapat plus-tecknet med ett omvänt
snedstreck. Nu ser sökmönstret ut som det ska: bokstaven
'a', sedan ett plus
'+', sedan bokstaven 'x'.
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
Resultatet som skrivs till variabeln blir följande:
'! ax aax aaax'
Exempel
I detta exempel ser mönstret ut så här: bokstaven
'a', sedan en punkt '.', sedan
bokstaven 'x':
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
Resultatet som skrivs till variabeln blir följande:
'! abx azx'
Exempel
I nästa exempel glömde författaren att escapna snedstrecket och alla delsträngar matchades av det reguljära uttrycket, eftersom en oescapad punkt representerar vilket tecken som helst:
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
Resultatet som skrivs till variabeln blir följande:
'! ! !'
Anmärkning
Observera att om du glömmer det omvända snedstrecket för punkten (när den ska representera sig själv) - kan det vara svårt att märka:
'a.x'.replace(/a.x/g, '!'); // returnerar '!', som vi ville
Visuellt fungerar det korrekt (eftersom punkten
representerar vilket tecken som helst, inklusive en vanlig
punkt '.'). Men om vi ändrar strängen
där ersättningarna sker - kommer vi att se vårt
misstag:
'a.x abx azx'.replace(/a.x/g, '!'); // returnerar '! ! !', men förväntat var '! abx azx'
Lista över specialtecken och vanliga tecken
Om man escapar ett vanligt tecken - händer inget hemskt - det kommer fortfarande att representera sig självt. Undantaget är siffror, de kan inte escapas.
Ofta finns det tvivel om ett visst tecken är specialtecken eller inte. Vissa kommer till det punkt att de escapar alla misstänkta tecken i följd. Detta är dock dålig praxis (skräpar ner det reguljära uttrycket med omvända snedstreck).
Specialtecken är: $ ^ . * + ? \
/ {} [] () |
Icke-specialtecken är: @ : , ' " ;
- _ = < > % # ~ `& !
Praktiska uppgifter
Given en sträng:
let str = 'a.a aba aea';
Skriv ett reguljärt uttryck som hittar strängen
'a.a', utan att fånga de andra.
Given en sträng:
let str = '2+3 223 2223';
Skriv ett reguljärt uttryck som hittar strängen
'2+3', utan att fånga de andra.
Given en sträng:
let str = '23 2+3 2++3 2+++3 345 567';
Skriv ett reguljärt uttryck som hittar strängarna
'2+3', '2++3', '2+++3',
utan att fånga de andra (+ kan vara vilket
antal som helst).
Given en sträng:
let str = '23 2+3 2++3 2+++3 445 677';
Skriv ett reguljärt uttryck som hittar strängarna
'23', '2+3', '2++3',
'2+++3', utan att fånga de andra.
Given en sträng:
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
Skriv ett reguljärt uttryck som hittar strängarna
'*q+', '*qq+', '*qqq+',
utan att fånga de andra.
Given en sträng:
let str = '[abc] {abc} abc (abc) [abc]';
Skriv ett reguljärt uttryck som hittar strängarna
i hakparenteser och ersätter dem med '!'.