Muntazam ifodalar (RegExp)

Belgilar sinflari

Belgi sinfi (character class) β€” muntazam ifodada belgilarning ma'lum bir turini bildiruvchi maxsus yozuv. Masalan, "istalgan raqam" yoki "istalgan bo'shliq belgisi". Belgi sinflari muntazam ifodalarning eng ko'p ishlatiladigan qismlaridan biridir. Ushbu darsda barcha asosiy belgi sinflarini, nuqta belgisini va ularni amaliy misollarda qo'llashni o'rganamiz.

Belgi sinfi nima?

Ba'zan biz aniq bir belgini emas, balki butun bir toifadagi belgini qidiramiz. Masalan, telefon raqamidagi barcha raqamlarni topmoqchimiz, ammo qaysi raqamlar ekanini oldindan bilmaymiz. Aynan shunday holatlarda belgi sinflari yordamga keladi.

Eng muhim belgi sinfi β€” raqam (digit). U \d deb yoziladi va istalgan bitta raqamga (0 dan 9 gacha) mos keladi:

digit.js
// natija shu yerda chiqadi

Asosiy belgi sinflari

JavaScript'da uchta asosiy belgi sinfi va ularning har biri uchun teskari (inkor) varianti mavjud:

Diqqat qiling: katta harfli variant har doim teskari ma'noni bildiradi. Ya'ni \d raqam bo'lsa, \D β€” raqam bo'lmagan hamma narsa. Bu qoida barcha juftliklar uchun amal qiladi.
sinflar.js
// natija shu yerda chiqadi

Nuqta (.) β€” istalgan belgi

Nuqta . β€” bu maxsus belgi sinfi bo'lib, qatorga o'tish belgisidan tashqari istalgan bitta belgiga mos keladi:

nuqta.js
// natija shu yerda chiqadi
Nuqta istalgan belgiga mos keladi, lekin odatiy holda qatorga o'tish belgisi \n ga mos kelmaydi. Shuning uchun ko'p qatorli matnda nuqta bir qator ichida qoladi.
nuqta-newline.js
// natija shu yerda chiqadi

s flagi β€” nuqta har qanday belgiga

Agar nuqta qatorga o'tish belgisini ham qamrab olishini istasangiz, s (dotall) flagini qo'shing. U bilan nuqta haqiqatan ham istalgan belgiga, jumladan \n ga ham mos keladi:

s-flag.js
// natija shu yerda chiqadi
Agar muhitingizda negadir s flagi qo'llab-quvvatlanmasa, uning muqobili sifatida [\s\S] yozuvini ishlatish mumkin β€” u "bo'shliq belgisi YOKI bo'shliq bo'lmagan belgi" degani bo'lib, amalda mutlaqo istalgan belgiga mos keladi.
s-muqobil.js
// natija shu yerda chiqadi

Unicode haqida qisqacha

Belgi sinflari birinchi navbatda ASCII (lotin) belgilariga mo'ljallangan. Masalan, \w faqat lotin harflari, raqamlar va _ ga mos keladi β€” o'zbek, kirill yoki boshqa alifbolarga mos kelmaydi:

unicode-w.js
// natija shu yerda chiqadi
To'liq unicode qo'llab-quvvatlash uchun u flagi va unicode xossalari (masalan \p{L} β€” istalgan alifbodagi harf) ishlatiladi. Bu ilg'or mavzu bo'lib, alohida darsda batafsil ko'rib chiqiladi. Hozircha shuni yodda tuting: \w β€” bu faqat lotin so'z belgilari.

Amaliy misol: telefon raqamini ajratish

Endi belgi sinflarini amaliyotda qo'llaymiz. Foydalanuvchi telefon raqamini turli formatlarda kiritishi mumkin β€” probellar, chiziqchalar, qavslar bilan. Bizga esa faqat raqamlar kerak. \d va g flagi bu vazifani oson hal qiladi:

telefon-ajratish.js
// natija shu yerda chiqadi

Aksincha, biz raqam bo'lmagan barcha belgilarni o'chirib tashlashimiz ham mumkin β€” buning uchun \D (raqam bo'lmagan) sinfini replace bilan ishlatamiz:

telefon-tozalash.js
// natija shu yerda chiqadi

Yana bir amaliy vazifa β€” matndan barcha "so'z"larni ajratib olish. Buning uchun \w+ naqshi ishlatiladi (bu yerda + β€” "bir yoki undan ko'p" belgisi, uni keyingi darslarda o'rganamiz):

sozlarni-ajratish.js
// natija shu yerda chiqadi

Bo'shliq belgisiga e'tibor

Ko'pchilik \s (bo'shliq) belgisini e'tiborsiz qoldiradi, ammo u juda muhim. Bo'shliq nafaqat probel, balki tabulyatsiya va qatorga o'tish belgilarini ham o'z ichiga oladi β€” matnni to'g'ri tozalashda buni hisobga olish kerak:

bosliq.js
// natija shu yerda chiqadi

Xulosa