სპეციალური სიმბოლოების ეკრანირება JavaScript-ის რეგულარულ გამონათქვამებში
დავუშვათ, გვსურს, რომ სპეციალური სიმბოლო თავის თავს აღნიშნავდეს. ამისთვის მისი ეკრანირება საჭიროა უკანა ხაზის გამოყენებით. მოდით შევხედოთ მაგალითებს.
მაგალითი
შემდეგ მაგალითში რეგულარული გამონათქვამის ავტორს სურდა,
რომ ძიების შაბლონი ასე გამოეთქვა: ასო
'a', შემდეგ პლუსი '+', შემდეგ
ასო 'x'. თუმცა, კოდის ავტორმა
არ დაეკრანა სიმბოლო '+' და ამიტომ
ძიების შაბლონი რეალურად ასე გამოიყურება:
ასო 'a' ერთი ან მეტჯერ, შემდეგ
ასო 'x':
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
შედეგად ცვლადში ჩაიწერება შემდეგი:
'a+x ! ! !'
მაგალითი
ახლა კი ავტორმა დაეკრანა პლუსი უკანა ხაზით.
ახლა ძიების შაბლონი ისე გამოიყურება, როგორც
საჭიროა: ასო 'a', შემდეგ პლუსი
'+', შემდეგ ასო 'x'.
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
შედეგად ცვლადში ჩაიწერება შემდეგი:
'! ax aax aaax'
მაგალითი
ამ მაგალითში შაბლონი ასე გამოიყურება: ასო
'a', შემდეგ წერტილი '.', შემდეგ
ასო 'x':
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
შედეგად ცვლადში ჩაიწერება შემდეგი:
'! abx azx'
მაგალითი
შემდეგ მაგალითში ავტორმა დაავიწყდა წერტილის ეკრანირება და რეგულარულმა გამონათქვამმა მოიცვა ყველა ქვესტრიქონი, რადგან არადაეკრანებული წერტილი აღნიშნავს ნებისმიერ სიმბოლოს:
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
შედეგად ცვლადში ჩაიწერება შემდეგი:
'! ! !'
შენიშვნა
გაითვალისწინეთ, რომ თუ დაგავიწყდებათ უკანა ხაზი წერტილისთვის (მაშინ, როცა ის თავის თავს უნდა აღნიშნავდეს) - ამის შემჩნევაც კი შეიძლება ვერ მოხერხდეს:
'a.x'.replace(/a.x/g, '!'); // დააბრუნებს '!', როგორც ვგეგმავდით
ვიზუალურად სწორად მუშაობს (რადგან წერტილი
ნებისმიერ სიმბოლოს აღნიშნავს, მათ შორის ჩვეულებრივ
წერტილს '.'). მაგრამ თუ შევცვლით სტრიქონს,
რომელშიც ჩანაცვლება ხდება - ჩვენს შეცდომას დავინახავთ:
'a.x abx azx'.replace(/a.x/g, '!'); // დააბრუნებს '! ! !', მოსალოდნელი იყო '! abx azx'
სპეციალური და ჩვეულებრივი სიმბოლოების სია
თუ ჩვეულებრივ სიმბოლოს დავეკრანებთ - არაფერი საშინელი არ მოხდება - ის მაინც თავის თავს აღნიშნავს. გამონაკლისი - ციფრები, მათი ეკრანირება არ შეიძლება.
ხშირად ჩნდება ეჭვი, არის თუ არა მოცემული სიმბოლო სპეციალური. ზოგი იმაზე კი მიდის, რომ ყველა ეჭვიან სიმბოლოს ეკრანირებს ზედიზედ. თუმცა, ეს ცუდი პრაქტიკაა (აბინძურებს რეგულარულ გამონათქვამს უკანა ხაზებით).
სპეციალური სიმბოლოებია: $ ^ . * + ? \
/ {} [] () |
არ არის სპეციალური სიმბოლოები: @ : , ' " ;
- _ = < > % # ~ `& !
პრაქტიკული ამოცანები
მოცემულია სტრიქონი:
let str = 'a.a aba aea';
დაწერეთ რეგულარული გამონათქვამი, რომელიც იპოვის სტრიქონს
'a.a', და არ მოიცავს დანარჩენებს.
მოცემულია სტრიქონი:
let str = '2+3 223 2223';
დაწერეთ რეგულარული გამონათქვამი, რომელიც იპოვის სტრიქონს
'2+3', და არ მოიცავს დანარჩენებს.
მოცემულია სტრიქონი:
let str = '23 2+3 2++3 2+++3 345 567';
დაწერეთ რეგულარული გამონათქვამი, რომელიც იპოვის სტრიქონებს
'2+3', '2++3', '2+++3',
და არ მოიცავს დანარჩენებს (+ შეიძლება იყოს ნებისმიერი
რაოდენობის).
მოცემულია სტრიქონი:
let str = '23 2+3 2++3 2+++3 445 677';
დაწერეთ რეგულარული გამონათქვამი, რომელიც იპოვის სტრიქონებს
'23', '2+3', '2++3',
'2+++3', და არ მოიცავს დანარჩენებს.
მოცემულია სტრიქონი:
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
დაწერეთ რეგულარული გამონათქვამი, რომელიც იპოვის სტრიქონებს
'*q+', '*qq+', '*qqq+',
და არ მოიცავს დანარჩენებს.
მოცემულია სტრიქონი:
let str = '[abc] {abc} abc (abc) [abc]';
დაწერეთ რეგულარული გამონათქვამი, რომელიც იპოვის სტრიქონებს
კვადრატულ ფრჩხილებში და შეცვლის მათ '!'-ით.