Ekranowanie znaków specjalnych w wyrażeniach regularnych JavaScript
Załóżmy, że chcemy sprawić, aby znak specjalny oznaczał sam siebie. W tym celu należy go ekranować za pomocą ukośnika odwrotnego. Spójrzmy na przykłady.
Przykład
W następującym przykładzie autor wyrażenia regularnego chciał,
aby wzorzec wyszukiwania wyglądał tak: litera
'a', następnie plus '+', następnie
litera 'x'. Jednakże, autor kodu
nie wyekranował symbolu '+' i dlatego
wzorzec wyszukiwania w rzeczywistości wygląda tak:
litera 'a' jeden lub więcej razy, potem
litera 'x':
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
W rezultacie do zmiennej zostanie zapisane następujące:
'a+x ! ! !'
Przykład
A teraz autor wyekranował plus ukośnikiem odwrotnym.
Teraz wzorzec wyszukiwania wygląda tak,
jak należy: litera 'a', następnie plus
'+', następnie litera 'x'.
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
W rezultacie do zmiennej zostanie zapisane następujące:
'! ax aax aaax'
Przykład
W tym przykładzie wzorzec wygląda tak: litera
'a', następnie kropka '.', następnie
litera 'x':
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
W rezultacie do zmiennej zostanie zapisane następujące:
'! abx azx'
Przykład
W następnym przykładzie autor zapomniał wyekranować kropkę i pod wyrażenie regularne trafiły wszystkie podciągi, ponieważ niewyekranowana kropka oznacza dowolny znak:
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
W rezultacie do zmiennej zostanie zapisane następujące:
'! ! !'
Uwaga
Zwróć uwagę na to, że jeśli zapomnisz ukośnika odwrotnego dla kropki (kiedy ma ona oznaczać samą siebie) - można tego nawet nie zauważyć:
'a.x'.replace(/a.x/g, '!'); // zwróci '!', tak jak chcieliśmy
Wizualnie działa poprawnie (ponieważ kropka
oznacza dowolny znak, w tym również zwykłą
kropkę '.'). Ale jeśli zmienimy ciąg,
w którym odbywają się zamiany - zobaczymy nasz
błąd:
'a.x abx azx'.replace(/a.x/g, '!'); // zwróci '! ! !', a oczekiwano '! abx azx'
Lista znaków specjalnych i zwykłych
Jeśli wyekranujemy zwykły znak - nic strasznego się nie stanie - i tak będzie on oznaczał sam siebie. Wyjątek - cyfry, ich nie można ekranować.
Często pojawia się wątpliwość, czy dany znak jest specjalny. Niektórzy dochodzą do tego, że ekranują wszystkie podejrzane znaki jeden po drugim. Jest to jednak zła praktyka (zaśmieca wyrażenie regularne ukośnikami odwrotnymi).
Są znakami specjalnymi: $ ^ . * + ? \
/ {} [] () |
Nie są znakami specjalnymi: @ : , ' " ;
- _ = < > % # ~ `& !
Zadania praktyczne
Dany jest ciąg:
let str = 'a.a aba aea';
Napisz wyrażenie regularne, które znajdzie ciąg
'a.a', nie chwytając pozostałych.
Dany jest ciąg:
let str = '2+3 223 2223';
Napisz wyrażenie regularne, które znajdzie ciąg
'2+3', nie chwytając pozostałych.
Dany jest ciąg:
let str = '23 2+3 2++3 2+++3 345 567';
Napisz wyrażenie regularne, które znajdzie ciągi
'2+3', '2++3', '2+++3',
nie chwytając pozostałych (+ może być dowolna
ilość).
Dany jest ciąg:
let str = '23 2+3 2++3 2+++3 445 677';
Napisz wyrażenie regularne, które znajdzie ciągi
'23', '2+3', '2++3',
'2+++3', nie chwytając pozostałych.
Dany jest ciąg:
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
Napisz wyrażenie regularne, które znajdzie ciągi
'*q+', '*qq+', '*qqq+',
nie chwytając pozostałych.
Dany jest ciąg:
let str = '[abc] {abc} abc (abc) [abc]';
Napisz wyrażenie regularne, które znajdzie ciągi
w nawiasach kwadratowych i zamieni je na '!'.