Muntazam ifodalar: kirish
Muntazam ifodalar (regular expressions, qisqacha regexp yoki regex) โ matnda naqsh (pattern) bo'yicha qidirish va almashtirishning kuchli usulidir. Ular JavaScript'ga tilning o'zi orqali RegExp obyekti ko'rinishida chuqur singdirilgan va satrlarning bir qator metodlari bilan birgalikda ishlaydi. Ushbu darsda muntazam ifoda nima ekanligini, uni qanday yaratishni, flaglarini va asosiy metodlarini chuqur o'rganamiz.
Muntazam ifoda nima?
Muntazam ifoda โ bu naqshdan (pattern) va ixtiyoriy flaglardan (flags) tashkil topgan matn qidiruv shabloni. Naqsh matnda nimani qidirayotganimizni tavsiflaydi, flaglar esa qidiruvni qanday amalga oshirishni sozlaydi.
JavaScript'da muntazam ifoda o'rnatilgan RegExp tipiga tegishli obyekt bo'lib, uni yaratishning ikki usuli mavjud.
Regexp yaratishning ikki usuli
Birinchi va eng keng tarqalgan usul โ slash (qiya chiziq) sintaksisi. Naqsh ikkita qiya chiziq /.../ orasiga yoziladi:
let regexp = /naqsh/; // flagsiz
let regexp2 = /naqsh/gmi; // g, m, i flaglari bilan
Ikkinchi usul โ konstruktor sintaksisi. Naqsh satr ko'rinishida new RegExpga uzatiladi:
let regexp = new RegExp('naqsh');
let regexp2 = new RegExp('naqsh', 'gmi');
Ikkalasi ham bir xil RegExp obyektini yaratadi. Asosiy farq: slash sintaksisi naqshni to'g'ridan-to'g'ri kod ichida yozishga imkon beradi va u statik โ kod yozilayotganda naqsh aniq bo'lishi kerak. Konstruktor esa naqshni satr sifatida qabul qiladi, shu sabab u dinamik โ naqshni ish vaqtida shakllantirishga imkon beradi.
/\d/ naqshini konstruktor orqali yozsangiz, new RegExp('\\d') deb yozishga to'g'ri keladi, chunki satr ichida \d avval JavaScript satr eskeypi sifatida qayta ishlanadi. Slash sintaksisida bunday muammo yo'q.Flaglar
Muntazam ifodalarning oltita flagi bor. Ular qidiruvning xatti-harakatini o'zgartiradi va ixtiyoriy tartibda birga yozilishi mumkin:
gโ global qidiruv: birinchi mos kelishdan keyin to'xtamasdan, barcha mosliklarni topadi;iโ ignore case: katta-kichik harflarni farqlamaydi (Avaabir xil hisoblanadi);mโ multiline: ko'p qatorli rejim (langarlar^va$ni ta'sirlaydi);sโ dotall rejimi: nuqta.qatorga o'tish belgisini\nham qamrab oladi;uโ unicode: to'liq unicode qo'llab-quvvatlashini yoqadi (surrogat juftliklarni to'g'ri ishlaydi);yโ sticky (yopishqoq) rejim: aynan berilgan pozitsiyadan qidiradi.
Eng ko'p ishlatiladigan flaglar โ g va i. Boshqalarini keyingi darslarda batafsil ko'rib chiqamiz.
str.search โ pozitsiyani topish
str.search(regexp) metodi birinchi moslikning pozitsiyasini (indeksini) qaytaradi, moslik topilmasa -1 qaytaradi. U faqat birinchi moslikni qidiradi (g flagini e'tiborsiz qoldiradi).
regexp.test โ moslik bor-yo'qligini tekshirish
regexp.test(str) metodi satrda naqshga mos keluvchi qism bor-yo'qligini tekshiradi va true yoki false qaytaradi. U eng tez va sodda usul โ faqat "bormi yoki yo'qmi" degan savolga javob kerak bo'lganda ishlatiladi.
str.match โ mosliklarni topish
str.match(regexp) metodining xatti-harakati g flagining bor-yo'qligiga bog'liq โ bu juda muhim nozik jihat.
g flagisiz
g flagi bo'lmasa, str.match faqat birinchi moslikni qaytaradi. Natija โ massivsimon obyekt: [0] โ topilgan matn, index โ pozitsiya, input โ asl satr:
g flagi bilan
g flagi bilan str.match barcha mosliklarni oddiy massiv ko'rinishida qaytaradi (pozitsiya va boshqa qo'shimcha ma'lumotsiz):
str.match massiv emas, null qaytaradi (bo'sh massiv emas!). Shu sabab natijani ishlatishdan oldin tekshirish yaxshi odat: let m = str.match(...); if (m) { ... }.str.replace โ almashtirish
str.replace(regexp, replacement) metodi mos kelgan qismlarni almashtiradi. g flagisiz faqat birinchi moslikni, g flagi bilan esa barcha mosliklarni almashtiradi:
Almashtiruvchi matnda maxsus belgilar ishlatish mumkin. Masalan, $& โ topilgan butun moslikni bildiradi:
str.replacening ikkinchi argumenti sifatida funksiya ham berish mumkin โ u har bir moslik uchun chaqiriladi va uning qaytargan qiymati almashtiruvchi bo'ladi. Bu murakkab, kontekstga bog'liq almashtirishlar uchun juda foydali.Xulosa
- Muntazam ifoda โ naqsh va flaglardan iborat qidiruv shabloni;
/naqsh/flaglaryokinew RegExp('naqsh', 'flaglar')orqali yaratiladi; - asosiy flaglar:
g(global),i(harf farqsiz),m,s,u,y; regexp.test(str)โ moslik bor-yo'qliginitrue/falseqaytaradi;str.search(regexp)โ birinchi moslik pozitsiyasi yoki-1;str.match(regexp)โgflagisiz birinchi moslik (index bilan),gbilan hamma mosliklar massivi; moslik yo'q bo'lsanull;str.replace(regexp, ...)โ almashtirish;gflagi hamma mosliklarga ta'sir qiladi; ikkinchi argument funksiya ham bo'lishi mumkin.