Maskierung von Sonderzeichen in JavaScript-Regexen
Angenommen, wir möchten, dass ein Sonderzeichen sich selbst bezeichnet. Dazu muss es mit einem Backslash maskiert werden. Sehen wir uns Beispiele an.
Beispiel
Im folgenden Beispiel wollte der Autor des regulären Ausdrucks,
dass das Suchmuster so aussieht: Buchstabe
'a', dann Plus '+', dann
Buchstabe 'x'. Allerdings hat der Code-Autor
das Zeichen '+' nicht maskiert und daher
sieht das Suchmuster tatsächlich so aus:
Buchstabe 'a' ein- oder mehrmals, dann
Buchstabe 'x':
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
In die Variable wird folgendes geschrieben:
'a+x ! ! !'
Beispiel
Jetzt hat der Autor das Plus mit einem Backslash
maskiert. Nun sieht das Suchmuster so aus,
wie es soll: Buchstabe 'a', dann Plus
'+', dann Buchstabe 'x'.
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
In die Variable wird folgendes geschrieben:
'! ax aax aaax'
Beispiel
In diesem Beispiel sieht das Muster so aus: Buchstabe
'a', dann Punkt '.', dann
Buchstabe 'x':
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
In die Variable wird folgendes geschrieben:
'! abx azx'
Beispiel
Im nächsten Beispiel hat der Autor vergessen, den Punkt zu maskieren, und unter den regulären Ausdruck fielen alle Teilzeichenketten, da ein unmaskierter Punkt ein beliebiges Zeichen bezeichnet:
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
In die Variable wird folgendes geschrieben:
'! ! !'
Bemerkung
Beachten Sie, dass man es möglicherweise nicht einmal bemerkt, wenn man den Backslash für den Punkt vergisst (wenn er sich selbst bezeichnen soll):
'a.x'.replace(/a.x/g, '!'); // gibt '!' zurück, wie wir wollten
Visuell funktioniert es korrekt (da der Punkt
ein beliebiges Zeichen bezeichnet, einschließlich eines normalen
Punkts '.'). Aber wenn wir die Zeichenkette ändern,
in der die Ersetzungen stattfinden - sehen wir unseren
Fehler:
'a.x abx azx'.replace(/a.x/g, '!'); // gibt '! ! !' zurück, erwartet wurde '! abx azx'
Liste der Sonderzeichen und gewöhnlichen Zeichen
Wenn ein gewöhnliches Zeichen maskiert wird - passiert nichts Schlimmes - es wird weiterhin sich selbst bezeichnen. Eine Ausnahme sind Ziffern, diese können nicht maskiert werden.
Oft gibt es Zweifel, ob ein bestimmtes Zeichen ein Sonderzeichen ist. Manche gehen soweit, dass sie alle verdächtigen Zeichen nacheinander maskieren. Dies ist jedoch eine schlechte Praxis (überlädt den regulären Ausdruck mit Backslashes).
Sonderzeichen sind: $ ^ . * + ? \
/ {} [] () |
Keine Sonderzeichen sind: @ : , ' " ;
- _ = < > % # ~ `& !
Praktische Aufgaben
Gegeben sei die Zeichenkette:
let str = 'a.a aba aea';
Schreiben Sie einen regulären Ausdruck, der die Zeichenkette
'a.a' findet, ohne die anderen zu erfassen.
Gegeben sei die Zeichenkette:
let str = '2+3 223 2223';
Schreiben Sie einen regulären Ausdruck, der die Zeichenkette
'2+3' findet, ohne die anderen zu erfassen.
Gegeben sei die Zeichenkette:
let str = '23 2+3 2++3 2+++3 345 567';
Schreiben Sie einen regulären Ausdruck, der die Zeichenketten
'2+3', '2++3', '2+++3',
findet, ohne die anderen zu erfassen (+ kann beliebig
oft vorkommen).
Gegeben sei die Zeichenkette:
let str = '23 2+3 2++3 2+++3 445 677';
Schreiben Sie einen regulären Ausdruck, der die Zeichenketten
'23', '2+3', '2++3',
'2+++3' findet, ohne die anderen zu erfassen.
Gegeben sei die Zeichenkette:
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
Schreiben Sie einen regulären Ausdruck, der die Zeichenketten
'*q+', '*qq+', '*qqq+',
findet, ohne die anderen zu erfassen.
Gegeben sei die Zeichenkette:
let str = '[abc] {abc} abc (abc) [abc]';
Schreiben Sie einen regulären Ausdruck, der die Zeichenketten
in eckigen Klammern findet und sie durch '!' ersetzt.