Escapen van speciale tekens in JavaScript reguliere expressies
Stel dat we willen dat een speciaal teken zichzelf vertegenwoordigt. Hiervoor moet het geëscaped worden met een backslash. Laten we eens kijken naar voorbeelden.
Voorbeeld
In het volgende voorbeeld wilde de auteur van de reguliere expressie
dat het zoekpatroon er als volgt uitzag: letter
'a', dan plus '+', dan
letter 'x'. De auteur van de code
heeft het teken '+' echter niet geëscaped en daarom
ziet het zoekpatroon er in werkelijkheid zo uit:
letter 'a' een of meer keer, dan
letter 'x':
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
Als resultaat wordt het volgende in de variabele geschreven:
'a+x ! ! !'
Voorbeeld
En nu heeft de auteur de plus geëscaped met een
backslash. Nu ziet het zoekpatroon eruit
zoals het hoort: letter 'a', dan plus
'+', dan letter 'x'.
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
Als resultaat wordt het volgende in de variabele geschreven:
'! ax aax aaax'
Voorbeeld
In dit voorbeeld ziet het patroon er als volgt uit: letter
'a', dan punt '.', dan
letter 'x':
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
Als resultaat wordt het volgende in de variabele geschreven:
'! abx azx'
Voorbeeld
In het volgende voorbeeld vergat de auteur de punt te escapen en alle substrings werden gevonden door de reguliere expressie, omdat een niet-geëscapte punt elk teken vertegenwoordigt:
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
Als resultaat wordt het volgende in de variabele geschreven:
'! ! !'
Opmerking
Let op het feit dat als je de backslash voor de punt vergeet (wanneer deze zichzelf zou moeten vertegenwoordigen) - dit kan zelfs onopgemerkt blijven:
'a.x'.replace(/a.x/g, '!'); // retourneert '!', zoals we wilden
Visueel werkt het correct (omdat de punt
elk teken vertegenwoordigt, inclusief een gewone
punt '.'). Maar als we de string veranderen
waarin de vervangingen plaatsvinden - zien we onze
fout:
'a.x abx azx'.replace(/a.x/g, '!'); // retourneert '! ! !', maar werd '! abx azx' verwacht
Lijst van speciale tekens en gewone tekens
Als je een gewoon teken escapest - er gebeurt niets ergs - het zal nog steeds zichzelf vertegenwoordigen. Uitzondering - cijfers, deze kunnen niet geëscaped worden.
Vaak bestaat er twijfel of een bepaald teken speciaal is. Sommigen gaan zo ver dat ze alle verdachte tekens achter elkaar escapen. Dit is echter een slechte praktijk (vervuilt de reguliere expressie met backslashes).
Speciale tekens zijn: $ ^ . * + ? \
/ {} [] () |
Geen speciale tekens zijn: @ : , ' " ;
- _ = < > % # ~ `& !
Praktische opdrachten
Gegeven een string:
let str = 'a.a aba aea';
Schrijf een reguliere expressie die de string
'a.a' vindt, zonder de anderen te vangen.
Gegeven een string:
let str = '2+3 223 2223';
Schrijf een reguliere expressie die de string
'2+3' vindt, zonder de anderen te vangen.
Gegeven een string:
let str = '23 2+3 2++3 2+++3 345 567';
Schrijf een reguliere expressie die de strings
'2+3', '2++3', '2+++3' vindt,
zonder de anderen te vangen (+ kan elk
aantal zijn).
Gegeven een string:
let str = '23 2+3 2++3 2+++3 445 677';
Schrijf een reguliere expressie die de strings
'23', '2+3', '2++3',
'2+++3' vindt, zonder de anderen te vangen.
Gegeven een string:
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
Schrijf een reguliere expressie die de strings
'*q+', '*qq+', '*qqq+' vindt,
zonder de anderen te vangen.
Gegeven een string:
let str = '[abc] {abc} abc (abc) [abc]';
Schrijf een reguliere expressie die de strings
in vierkante haakjes vindt en ze vervangt door '!'.