Specialiųjų simbolių ekranavimas JavaScript reguliariosiose išraiškose
Tarkime, kad norime, kad specialusis simbolis reikštų pats save. Tam jį reikia ekranuoti naudojant atgalinį pasvirąjį brūkšnį. Pažiūrėkime pavyzdžiais.
Pavyzdys
Šiame pavyzdyje reguliariosios išraiškos autorius norėjo,
kad paieškos šablonas atrodytų taip: raidė
'a', tada pliusas '+', tada
raidė 'x'. Tačiau, kodo autorius
neekranavo simbolio '+' ir todėl
paieškos šablonas iš tikrųjų atrodo taip:
raidė 'a' vieną ar daugiau kartų, paskui
raidė 'x':
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
Rezultate į kintamąjį bus įrašyta taip:
'a+x ! ! !'
Pavyzdys
O dabar autorius ekranavo pliusą atgaliniu
brūkšniu. Dabar paieškos šablonas atrodo taip,
kaip reikia: raidė 'a', tada pliusas
'+', tada raidė 'x'.
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
Rezultate į kintamąjį bus įrašyta taip:
'! ax aax aaax'
Pavyzdys
Šiame pavyzdyje šablonas atrodo taip: raidė
'a', tada taškas '.', tada
raidė 'x':
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
Rezultate į kintamąjį bus įrašyta taip:
'! abx azx'
Pavyzdys
Kitame pavyzdyje autorius pamiršo ekranuoti tašką ir pagal reguliariąją išraišką pateko visos eilutės, nes neekranuotas taškas reiškia bet kurį simbolį:
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
Rezultate į kintamąjį bus įrašyta taip:
'! ! !'
Pastaba
Atkreipkite dėmesį, kad jei pamiršite atgalinį brūkšnį taškui (kai jis turi reikšti pats save) - to galima net nepastebėti:
'a.x'.replace(/a.x/g, '!'); // grąžins '!', kaip ir norėjome
Vizualiai veikia teisingai (kadangi taškas
reiškia bet kurį simbolį, taip pat ir įprastą
tašką '.'). Bet jei pakeisime eilutę,
kurioje vyksta pakeitimai - pamatysime savo
klaidą:
'a.x abx azx'.replace(/a.x/g, '!'); // grąžins '! ! !', o tikėtasi '! abx azx'
Specialiųjų ir įprastų simbolių sąrašas
Jei ekranuosite įprastą simbolį - nieko blogo neatsitiks - jis vis tiek reikš patį save. Išimtis - skaičiai, jų ekranuoti negalima.
Dažnai kyla abejonių, ar šis simbolis yra specialus. Kai kurie net ima ekranuoti visus įtartinus simbolius iš eilės. Tačiau, tai yra bloga praktika (užteršia reguliariąją išraišką atgaliniais brūkšniais).
Yra specialieji simboliai: $ ^ . * + ? \
/ {} [] () |
Nėra specialieji simboliai: @ : , ' " ;
- _ = < > % # ~ `& !
Praktinės užduotys
Duota eilutė:
let str = 'a.a aba aea';
Parašykite reguliariąją išraišką, kuri ras eilutę
'a.a', neperimdama kitų.
Duota eilutė:
let str = '2+3 223 2223';
Parašykite reguliariąją išraišką, kuri ras eilutę
'2+3', neperimdama kitų.
Duota eilutė:
let str = '23 2+3 2++3 2+++3 345 567';
Parašykite reguliariąją išraišką, kuri ras eilutes
'2+3', '2++3', '2+++3',
neperimdama kitų (+ gali būti bet koks
kiekis).
Duota eilutė:
let str = '23 2+3 2++3 2+++3 445 677';
Parašykite reguliariąją išraišką, kuri ras eilutes
'23', '2+3', '2++3',
'2+++3', neperimdama kitų.
Duota eilutė:
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
Parašykite reguliariąją išraišką, kuri ras eilutes
'*q+', '*qq+', '*qqq+',
neperimdama kitų.
Duota eilutė:
let str = '[abc] {abc} abc (abc) [abc]';
Parašykite reguliariąją išraišką, kuri ras eilutes
kvadratiniuose skliaustuose ir pakeis jas į '!'.