Mundarija (38)
- Bu darsda
- 1. Nega bu kerak?
- 2. Langar nima
- 2.1 Belgi emas, joy
- 2.2 ^ — matn boshi
- 2.3 $ — matn oxiri
- 3. Ikkala langar birga: butun matn tekshiruvi
- 3.1 Boshidan oxirigacha
- 3.2 O'tgan darsdagi ism tekshiruvi
- 3.3 Telefon raqami
- 3.4 HTML pattern va langarlar
- 4. Hujumchi nigohi
- 5. m flagi: har qatorda
- 5.1 Ko'p qatorli matn
- 5.2 Qator nima
- 5.3 Boshqa tillardan bir farq
- 6. \b: so'z chegarasi
- 6.1 Butun so'zni qidirish
- 6.2 Chegara qayerda
- 6.3 \B: chegara emas
- 7. \b va o'zbek tili
- 7.1 Apostrof chegara yasaydi
- 7.2 Kirill harflari — chegara yo'q
- 7.3 Nima qilish kerak
- 8. Ko'p uchraydigan xatolar
- 8.1 Tekshiruvda langarni unutish
- 8.2 Faqat bittasini qo'yish
- 8.3 trim qilmaslik
- 8.4 Ko'p qatorli matnda m siz ^
- 8.5 \b ni bo'sh joy belgisi deb o'ylash
- 9. Mashqlar
- 1-mashq (oson): Vaqt maydoni
- 2-mashq (o'rta): Menyu qatorlari
- 3-mashq (qiyin): So'zni almashtirish, so'z ichidagini emas
- 4-mashq: Vazifalar qadami — teg faqat so'z boshida
- 10. Real ishda
- Xulosa
- Manbalar
Regex langarlari: ^, $, \b va m flag
Qisqacha: Langarlar belgi emas, joyni bildiradi.
/^\d\d:\d\d$/— "matn faqat vaqtdan iborat" degani: boshidagi belgi matn boshini, oxiridagi$esa matn oxirini bildiradi. Tekshiruvda ikkalasi ham majburiy,mflagi bilan esa ular har bir qator boshi va oxirida ishlaydi.\b— so'z chegarasi:/\bosh\b/oshni topadi,oshxonaichidagini emas.\B— teskarisi.
Bu darsda
^va$bilan "matn boshida", "matn oxirida" va "butun matn shu" degan shartlarni yozasiz.- Forma maydonini tekshirishda langarsiz regex nega xavfli ekanini ko'rasiz va buni tuzatasiz.
mflagi bilan ko'p qatorli matnning har qatorida qidirasiz.\bva\Bbilan butun so'zni qidirasiz va so'z ichidagisini ajratasiz.\bo'zbekcha apostrofli va kirill so'zlarda qanday aldashini bilasiz.
Oldin bilishingiz kerak: RegExp asoslari va metodlari, Belgilar va belgi klasslari, Brauzer validatsiyasi.
1. Nega bu kerak?
Sardor bron formasidagi vaqtni tekshiradigan funksiya yozdi. O'tgan darsda o'rgangan diapazonlardan foydalandi:
const vaqtNaqshi = /[0-2]\d:[0-5]\d/;
console.log(vaqtNaqshi.test("19:00")); // true
console.log(vaqtNaqshi.test("Kechqurun 19:00 atrofida")); // true
console.log(vaqtNaqshi.test("119:005")); // trueUchala qiymat ham "to'g'ri" deb topildi. Ikkinchisida ortiqcha so'zlar bor, uchinchisi umuman vaqt emas. test faqat "matnning biror joyida mos bo'lak bormi?" deb so'raydi. 119:005 ichida 19:00 bor — demak true.
Sardorga boshqa savol kerak edi: "matn boshidan oxirigacha vaqtdan iboratmi?". Buning uchun regex'ga "qayerda" degan ma'lumotni qo'shish kerak.
Ikkinchi muammo. Jasur aka menyu tavsifida "choy" so'zini katta harflar bilan ajratib qo'ymoqchi bo'ldi. replace(/choy/gi, "CHOY") esa choyxona ni CHOYxona ga aylantirdi. Bu yerda ham "qayerda" savoli: faqat alohida so'z bo'lgan choy.
Bugungi darsdagi belgilar shu "qayerda" savoliga javob beradi.
2. Langar nima
2.1 Belgi emas, joy
O'tgan darslardagi hamma narsa — o, \d, [.:] — matndagi belgini "yeydi": moslik shu belgini o'z ichiga oladi. Langar (anchor) esa hech qanday belgini yemaydi. U belgilar orasidagi joyni tekshiradi.
Matnni ipga terilgan munchoqlar deb tasavvur qiling. Har munchoq — bitta belgi. Langar munchoq emas. U ipning qayeri ekanini aytadi: "shu yer ipning boshi", "shu yer ikki munchoq orasi, chapdagisi harf, o'ngdagisi bo'sh joy".
Shuning uchun langar moslikka hech qanday belgi qo'shmaydi. Uzunligi nolga teng — nol kenglikdagi (zero-width) tekshiruv.
2.2 ^ — matn boshi
^ — "shu joy matnning boshi". /^Osh/ faqat matn Osh bilan boshlansa mos keladi:
console.log(/^Osh/.test("Osh — 35000 so'm")); // true
console.log(/^Osh/.test("Bugun Osh bor")); // falseIkkinchi matnda Osh bor, lekin boshida emas.
Langar nol kenglikda ekanini maydonda ko'rish mumkin. Naqsh faqat ^ dan iborat bo'lsa, u bitta bo'sh moslik beradi — matnning 0-o'rnida. Maydon bo'sh moslikni qizil vertikal chiziq bilan belgilaydi:
Jadvalda moslik "" — bo'sh satr, index — 0. ^ hech narsa yemadi, faqat "bu yer boshi" dedi.
2.3 $ — matn oxiri
$ — "shu joy matnning oxiri". /so'm$/ faqat matn so'm bilan tugasa mos keladi:
console.log(/so'm$/.test("Osh — 35000 so'm")); // true
console.log(/so'm$/.test("35000 so'm dan")); // falseNarxlar ro'yxatidan oxirgi sonni olish uchun ham qulay:
console.log("Osh 35000, manti 30000".match(/\d+$/)[0]); // 30000\d+$ — "matn oxirida turgan raqamlar". Birinchi son 35000 dan keyin matn davom etadi, shuning uchun u mos kelmadi.
Tekshirib ko'ring:
/^\d/va/[^\d]/farqi nima?
Javob
/^\d/ — "matn raqam bilan boshlanadi". Bu yerda ^ klassdan tashqarida — langar. /[^\d]/ — "raqam bo'lmagan bitta belgi". Bu yerda ^ klass ichida birinchi turibdi — inkor. Bir xil belgi, ikki butunlay boshqa ma'no — o'tgan darsda shu haqda ogohlantirgan edik.
3. Ikkala langar birga: butun matn tekshiruvi
3.1 Boshidan oxirigacha
^ va $ ni birga qo'ysangiz, naqsh matnning boshidan oxirigacha mos kelishi shart bo'ladi. Ortiqcha bitta belgi ham qolmaydi. Sardorning vaqt tekshiruvi:
const vaqtNaqshi = /^[0-2]\d:[0-5]\d$/;
console.log(vaqtNaqshi.test("19:00")); // true
console.log(vaqtNaqshi.test("Kechqurun 19:00 atrofida")); // false
console.log(vaqtNaqshi.test("119:005")); // falseEndi naqsh "boshlanishi — soat, keyin :, keyin daqiqa, va shu bilan tamom" deydi. 119:005 da boshida 11 bor, 9 esa : emas — moslik yo'q.
Bu — eng muhim qoida: tekshirish (validation) uchun regex deyarli har doim ^ bilan boshlanadi va $ bilan tugaydi. Qidirish uchun esa — langarsiz.
| Maqsad | Naqsh | Savol |
|---|---|---|
| Qidirish | /\d\d:\d\d/ |
matnda vaqt bormi? |
| Tekshirish | /^\d\d:\d\d$/ |
matnning o'zi vaqtmi? |
Bu farqni rasmda ko'ring — qaysi yo'l qaysi savolga olib boradi:
flowchart TD
Q{"Savol qanday?"} -->|"Matnda bormi?"| A["Langarsiz: /\d\d:\d\d/"]
Q -->|"Matnning o'zimi?"| B["^ ... $ bilan: /^\d\d:\d\d$/"]
A --> A1["'Soat 19:00 da' → true"]
B --> B1["'Soat 19:00 da' → false"]O'zingiz to'ldiring: tekshiruv naqshi matn boshini bildiruvchi belgisi bilan boshlanadi.
3.2 O'tgan darsdagi ism tekshiruvi
O'tgan darsda ismni inkor klass bilan tekshirgan edik: "begona belgi yo'qmi va ism bo'sh emasmi?" — ikki shart. Langarlar bilan bitta naqsh yetadi:
const ismNaqshi = /^[A-Za-z' ]+$/;
console.log(ismNaqshi.test("G'ayrat")); // true
console.log(ismNaqshi.test("Ali2")); // false
console.log(ismNaqshi.test("")); // falseO'qiymiz: boshidan oxirigacha — "lotin harf, apostrof yoki bo'sh joy"dan iborat bir yoki ko'p belgi. + bo'lgani uchun bo'sh satr ham o'tmaydi — kamida bitta belgi kerak.
3.3 Telefon raqami
Endi «Bahor» formasidagi telefonni tekshiramiz. Format qat'iy: +998 90 000 00 00.
const telNaqshi = /^\+998 \d\d \d\d\d \d\d \d\d$/;
console.log(telNaqshi.test("+998 90 000 00 00")); // true
console.log(telNaqshi.test("+998 90 000 00 000")); // false
console.log(telNaqshi.test("Tel: +998 90 000 00 00")); // falseNaqshni bo'laklab o'qing: boshi, \+998 — plyus va 998, bo'sh joy, ikki raqam, bo'sh joy, uch raqam, bo'sh joy, ikki raqam, bo'sh joy, ikki raqam, oxiri. Raqamlarni \d\d\d deb takrorlash noqulay — keyingi darsda buni \d{3} deb qisqartiramiz.
Diqqat: Foydalanuvchi ko'pincha maydon oxirida bilmasdan bo'sh joy qoldiradi:
"19:00 ". Langarli naqsh uni rad etadi. Shuning uchun tekshirishdan oldin qiymattrim()qilinadi (Matnni o'zgartirish va tozalash):vaqtNaqshi.test(qiymat.trim()).
3.4 HTML pattern va langarlar
Brauzer validatsiyasi darsida shunday degan edik: "Brauzer shablonni o'zi ^...$ bilan o'raydi". Endi bu gapning ma'nosi aniq.
pattern="\d\d:\d\d" yozsangiz, brauzer uni aslida ^(?:\d\d:\d\d)$ kabi tekshiradi: butun qiymat mos kelishi shart. (?:...) — qavs ichidagini bitta bo'lak qilib oladi, uni Guruhlar darsida o'rganamiz.
JavaScript'da esa hech kim sizning o'rningizga o'ramaydi. pattern dagi naqshni test ga ko'chirganda langarlarni o'zingiz qo'yishingiz kerak.
Tekshirib ko'ring:
/^\d\d\d\d-\d\d-\d\d$/naqshi"2026-10-05"va"Sana: 2026-10-05"dan qaysi biriga mos keladi?
Javob
Faqat "2026-10-05" ga. Ikkinchi matnda sana bor, lekin ^ talab qiladi: to'rt raqam matnning boshida tursin. U yerda esa Sana: turibdi.
4. Hujumchi nigohi
Langarsiz tekshiruv — shunchaki noqulaylik emas, xavfsizlik teshigi.
Faraz qiling, Sardor telefonni langarsiz tekshirdi va qiymatni Jasur akaning bronlar sahifasiga HTML sifatida chiqardi:
const zaifNaqsh = /\+998 \d\d \d\d\d \d\d \d\d/;
const kiritilgan = "+998 90 000 00 00<img src=x onerror=alert(1)>";
console.log(zaifNaqsh.test(kiritilgan)); // trueHujumchi haqiqiy raqam yozdi va uning ortidan HTML kodini qo'shdi. <img src=x onerror=...> — rasm tegi, uning manzili (x) ataylab buzuq. Brauzer rasmni yuklay olmaydi va onerror ichidagi kodni ishga tushiradi. Bu yerda u shunchaki alert(1), lekin hujumchi o'rniga istalgan kodni yozishi mumkin. Tekshiruv "ichida telefon bor" deb, hammasini o'tkazib yubordi. Agar bu qiymat keyin innerHTML bilan chiqarilsa, hujumchining kodi Jasur akaning brauzerida ishlaydi. Bu hujumning nomi — XSS, uni Kontentni o'zgartirish va XSS xavfi darsida ko'rgansiz.
Langarli naqsh bunday qiymatni rad etadi:
const telNaqshi = /^\+998 \d\d \d\d\d \d\d \d\d$/;
const kiritilgan = "+998 90 000 00 00<img src=x onerror=alert(1)>";
console.log(telNaqshi.test(kiritilgan)); // falseQoidalar:
- Tekshiruv regex'i —
^bilan boshlanadi,$bilan tugaydi. - Tekshiruv yagona himoya emas: qiymat baribir
textContentbilan chiqariladi,innerHTMLbilan emas. - Brauzerdagi tekshiruvni hujumchi chetlab o'ta oladi (so'rovni to'g'ridan-to'g'ri yuboradi). Shuning uchun xuddi shu tekshiruv serverda ham bo'ladi — buni Node qismida ko'ramiz.
5. m flagi: har qatorda
5.1 Ko'p qatorli matn
Jasur aka menyuni ko'p qatorli matn sifatida saqlaydi:
Osh 35000
Lag'mon 28000
Manti 30000Har qatorning birinchi so'zini — taom nomini — olmoqchimiz. ^[\w']+ naqshi "boshidagi so'z" degani. Lekin oddiy rejimda ^ faqat butun matnning boshi — birinchi qator.
m flagi (multiline — "ko'p qatorli") buni o'zgartiradi: ikkala langar har bir qator boshi va oxirida ishlaydi.
Uchala taom nomi topildi. m siz faqat Osh qoladi: ikkinchi va uchinchi qator boshlari "matn boshi" emas.
Narxlar uchun esa qator oxiri kerak:
const menyu = "Osh 35000\nLag'mon 28000\nManti 30000";
console.log(menyu.match(/\d+$/gm)); // [ '35000', '28000', '30000' ]
console.log(menyu.match(/\d+$/g)); // [ '30000' ]m siz $ faqat butun matn oxirini taniydi — oxirgi narxni.
5.2 Qator nima
m rejimida langarlar yangi qator belgilariga qaraydi: \n, Windows'dagi \r\n va yana ikkita kam uchraydigan belgi. Windows'da yozilgan fayl ham to'g'ri ishlaydi:
const menyu = "Osh 35000\r\nManti 30000";
console.log(menyu.match(/\d+$/gm)); // [ '35000', '30000' ]m faqat ^ va $ ga ta'sir qiladi. . hali ham yangi qatorni qabul qilmaydi — bu boshqa flag (s) ning ishi.
5.3 Boshqa tillardan bir farq
Python, PHP kabi tillarda dollar belgisi matn oxiridagi bitta yangi qator belgisidan oldin ham mos keladi. JavaScript'da — yo'q. m siz u faqat matnning eng oxiri:
console.log(/^osh$/.test("osh\n")); // false
console.log(/^osh$/m.test("osh\n")); // trueFayldan o'qilgan qator oxirida \n qolgan bo'lsa, tekshiruv kutilmaganda false beradi. Yechim — yana trim(). Internetdan boshqa til uchun yozilgan regex'ni ko'chirganda bu farqni yodda tuting.
Tekshirib ko'ring:
"Osh\nManti".match(/^Manti/)nima qaytaradi?mflagi qo'shilsa-chi?
Javob
m siz — null: ^ faqat butun matn boshi, u yerda esa Osh. m bilan — moslik topiladi, index 4: Manti ikkinchi qatorning boshida, O, s, h va \n dan keyin.
6. \b: so'z chegarasi
6.1 Butun so'zni qidirish
So'z chegarasi (word boundary) — \b — so'z belgisi bilan so'z bo'lmagan belgi orasidagi joy. O'tgan darsdan eslang: "so'z belgisi" — \w, ya'ni [A-Za-z0-9_]. Matnning boshi va oxiri ham chegara hisoblanadi, agar u yerda so'z belgisi tursa.
\b ham langar — u belgi yemaydi. /\bosh\b/ — "oldida ham, ortida ham so'z belgisi bo'lmagan osh":
Faqat birinchi Osh topildi. Oshxona da osh dan keyin x turibdi — u so'z belgisi, chegara yo'q. Toshkent da osh dan oldin T. oshi da osh dan keyin i.
Endi «Nega bu kerak?» bo'limidagi almashtirish:
const tavsif = "Choy, choyxona, ko'k choy";
console.log(tavsif.replace(/choy/gi, "CHOY"));
console.log(tavsif.replace(/\bchoy\b/gi, "CHOY"));Konsolda:
CHOY, CHOYxona, ko'k CHOY
CHOY, choyxona, ko'k CHOY\b bilan choyxona tegilmay qoldi.
6.2 Chegara qayerda
\b ni aniqlash uchun har ikki qo'shni belgiga qarang:
| Chap | O'ng | Chegara bormi? |
|---|---|---|
| so'z belgisi | so'z belgisi emas | ha |
| so'z belgisi emas | so'z belgisi | ha |
| so'z belgisi | so'z belgisi | yo'q |
| so'z belgisi emas | so'z belgisi emas | yo'q |
Matn boshi va oxiri "so'z belgisi emas" deb olinadi. Masalan, 12:30 da to'rtta chegara bor: 1 dan oldin, 2 dan keyin, 3 dan oldin, 0 dan keyin. Ikki nuqta atrofida \w va \W uchrashadi.
Raqamlar ham \w ga kiradi, shuning uchun \b sonlar bilan ham ishlaydi. /\b\d\d\b/ — "aynan ikki xonali son":
console.log("Stol 12, 123, 7".match(/\b\d\d\b/g)); // [ '12' ]123 ichida 12 bor, lekin undan keyin 3 — chegara yo'q. 7 esa bir xonali.
6.3 \B: chegara emas
\B — \b ning teskarisi: "so'z chegarasi bo'lmagan joy", ya'ni ikki so'z belgisi orasi yoki ikki so'z bo'lmagan belgi orasi. /\Bosh/ — "so'z boshida emas, ichida turgan osh":
const matn = "osh Toshkent oshxona";
console.log(matn.replace(/\Bosh/g, "[$&]")); // osh T[osh]kent oshxonaFaqat Toshkent ichidagisi belgilandi: unda osh dan oldin T turibdi. Qolgan ikkitasi so'z boshida.
Tekshirib ko'ring:
/\bkg\b/naqshi"3 kg un"va"3kg un"da topiladimi?
Javob
Birinchisida — ha: kg oldida bo'sh joy, ortida ham. Ikkinchisida — yo'q: kg oldida 3 turibdi, u ham so'z belgisi, demak 3 va k orasida chegara yo'q.
7. \b va o'zbek tili
\b \w ga tayanadi. O'tgan darsdan bilasiz: \w apostrofni ham, kirill harflarini ham tanimaydi. Shuning uchun \b o'zbekcha matnda ikki joyda aldaydi.
7.1 Apostrof chegara yasaydi
Apostrof — so'z belgisi emas. Demak bo'lim so'zining ichida — o va ' orasida va ' va l orasida — ikkita chegara bor:
const matn = "bo'lim lim";
console.log(matn.match(/\blim\b/g)); // [ 'lim', 'lim' ]
console.log(matn.replace(/\blim\b/g, "X")); // bo'X XBiz alohida lim so'zini qidirdik. \b esa bo'lim ning bo'lagini ham "alohida so'z" deb topdi. o'rik, g'isht, qo'shiq — har birida shunday yashirin chegara bor.
Maydonda o'zingiz ko'ring. Matnga yana bir nechta apostrofli so'z qo'shib, qaysilari "aldashini" toping:
Uchta moslikdan faqat bittasi haqiqiy so'z. limon ni regex to'g'ri tashlab ketdi: lim dan keyin o turibdi. bo'lim va ta'lim da esa lim oldida apostrof — regex uchun bu "so'z bo'lmagan belgi", demak chegara.
7.2 Kirill harflari — chegara yo'q
Ruscha matnda esa teskari muammo: kirill harflari \w emas, shuning uchun ular orasida \b umuman yo'q:
console.log("Ош ош".match(/\bош\b/g)); // nullIkkala so'z ham bor, lekin regex hech birini topmadi. u flagi ham bu yerda yordam bermaydi.
7.3 Nima qilish kerak
- Lotin yozuvidagi o'zbekcha so'z yonida apostrof bo'lishi mumkin bo'lsa,
\bga ishonmang — natijani sinab ko'ring. - Har qanday tilda "harf bilan harf bo'lmagan orasidagi joy"ni aniq yozish uchun Lookahead va lookbehind va Unicode regex darslaridagi vositalar kerak. U yerda bu masalaga qaytamiz.
- Oddiy holatda — so'zlar faqat bo'sh joy bilan ajralgan bo'lsa —
split(/\s+/)qilib, so'zlarni===bilan solishtirish ham ishonchli yo'l.
Tekshirib ko'ring:
"o'sh"matnida/\bsh\b/moslik topadimi? Nega?
Javob
Topadi. ' va s orasida chegara bor (' — \w emas, s — \w). h dan keyin matn tugaydi — u ham chegara. Regex uchun sh — "alohida so'z".
O'zingiz to'ldiring: ko'p qatorli matnda ^ har qator boshida ishlashi uchun flagi kerak.
8. Ko'p uchraydigan xatolar
8.1 Tekshiruvda langarni unutish
/\d\d:\d\d/.test(qiymat) — "ichida vaqt bormi?". Natijada 119:005 ham, 19:00 va yana nimadir ham, hujumchining HTML kodi ham o'tadi. Tuzatish: tekshiruvda har doim ikkala langar.
8.2 Faqat bittasini qo'yish
/^\d\d:\d\d/ — boshi qat'iy, oxiri ochiq: 19:00abc o'tadi.
/\d\d:\d\d$/ — teskarisi: abc19:00 o'tadi. Tuzatish: ikkalasi birga.
8.3 trim qilmaslik
"19:00 " langarli naqshdan o'tmaydi — foydalanuvchi esa xato ko'rmaydi, faqat "noto'g'ri vaqt" xabarini oladi. Tuzatish: naqsh.test(qiymat.trim()).
8.4 Ko'p qatorli matnda m siz ^
Menyu qatorlarini ^ bilan qidirsangiz, faqat birinchi qator topiladi va xato sezilmaydi. Tuzatish: har qator kerak bo'lsa — gm.
8.5 \b ni bo'sh joy belgisi deb o'ylash
\b — bo'sh joy belgisi emas, joy. /osh\bxona/ hech qachon osh xona ga mos kelmaydi: chegaradan keyin bo'sh joyni yeyish kerak edi — /osh\sxona/. Va \b apostrof yonida "aldaydi".
9. Mashqlar
1-mashq (oson): Vaqt maydoni
vaqtTogrimi(qiymat) — qiymat 07:00 kabi SS:DD ko'rinishida bo'lsa (trim dan keyin) true qaytarsin. Soat birinchi raqami 0–2, daqiqa birinchi raqami 0–5.
console.log(vaqtTogrimi(" 07:00 ")); // true
console.log(vaqtTogrimi("7:00")); // false
console.log(vaqtTogrimi("07:00 da")); // falseYechim
function vaqtTogrimi(qiymat) {
return /^[0-2]\d:[0-5]\d$/.test(qiymat.trim());
}
console.log(vaqtTogrimi(" 07:00 ")); // true
console.log(vaqtTogrimi("7:00")); // false
console.log(vaqtTogrimi("07:00 da")); // false7:00 da soat bir xonali — naqsh esa boshidan ikki raqam talab qiladi. Bir xonali soatga ham ruxsat berish uchun "ixtiyoriy" quantifier kerak — keyingi darsda.
2-mashq (o'rta): Menyu qatorlari
Ko'p qatorli menyudan narxlarni olib, eng qimmatini toping. Ishora: match + gm + qator oxiri langari, keyin Math.max(...) va map.
const menyu = "Osh 35000\nLag'mon 28000\nKo'k choy 5000";
// Eng qimmati: 35000Yechim
const menyu = "Osh 35000\nLag'mon 28000\nKo'k choy 5000";
const narxlar = (menyu.match(/\d+$/gm) ?? []).map(Number);
console.log(`Eng qimmati: ${Math.max(...narxlar)}`);Konsolda:
Eng qimmati: 35000m bilan qator oxiri langari har qatorda ishlaydi. map(Number) matnlarni songa aylantiradi — Math.max satr bilan ham ishlardi, lekin son bilan ishlash ishonchliroq.
3-mashq (qiyin): So'zni almashtirish, so'z ichidagini emas
sozniAlmashtir(matn, eski, yangi) — matndagi eski so'zini (katta-kichik harfga qaramay) faqat alohida so'z bo'lsa yangi ga almashtirsin. new RegExp dan foydalaning. Ishora: satrda \b uchun "\\b" yoziladi. eski faqat lotin harflaridan iborat deb hisoblang.
const tavsif = "Choy tayyor, choyxona ochiq";
console.log(sozniAlmashtir(tavsif, "choy", "kofe"));
// kofe tayyor, choyxona ochiqYechim
function sozniAlmashtir(matn, eski, yangi) {
const naqsh = new RegExp("\\b" + eski + "\\b", "gi");
return matn.replace(naqsh, yangi);
}
const tavsif = "Choy tayyor, choyxona ochiq";
console.log(sozniAlmashtir(tavsif, "choy", "kofe"));Konsolda:
kofe tayyor, choyxona ochiq"\\b" satrda \b ga aylanadi. Bitta \ bilan yozsangiz, "\b" satrda boshqa belgi — "backspace" bo'lib qolardi va regex hech narsa topmasdi. eski ga nuqta yoki plyus tushsa, u metabelgi bo'lib qoladi — xavfsiz usulini Almashtirish chuqur darsida o'rganamiz.
4-mashq: Vazifalar qadami — teg faqat so'z boshida
O'tgan darsdagi kurs/mashqlar/12/02-teglar/teglar.mjs ni davom ettiring. "Sut#2 olish #bozor" matnida Sut#2 — teg emas, shunchaki yozuv. Teg faqat # oldida harf yoki raqam bo'lmasa boshlanadi. \B dan foydalaning: # ning o'zi \w emas, demak # dan oldingi joy chegara bo'lmasa — oldida ham \w yo'q. Faylni kurs/mashqlar/12/03-teglar/teglar.mjs ga saqlang.
Yechim
const matn = "Sut#2 olish #bozor #do'kon";
console.log(matn.match(/#[\w']+/g));
console.log(matn.match(/\B#[\w']+/g));Konsolda:
[ '#2', '#bozor', "#do'kon" ]
[ '#bozor', "#do'kon" ]Sut#2 da t va # orasida chegara bor (t — \w, # — emas), shuning uchun \B u yerda mos kelmaydi. #bozor da # oldida bo'sh joy — ikkalasi ham \w emas, chegara yo'q, \B mos keladi. Matn boshidagi # ham ishlaydi: matn boshi "so'z belgisi emas" deb olinadi.
git add 12/03-teglar/teglar.mjs
git commit -m "12/03: teg faqat so'z boshida — \B bilan"10. Real ishda
- Forma tekshiruvi. Telefon, pochta indeksi, promo-kod — hamma joyda ikkala langar. Kod ko'rib chiqishda (code review) birinchi qaraladigan narsalardan biri: tekshiruv regex'ida langarlar bormi?
- Log va fayllar. Server loglari va CSV fayllar qatorma-qator o'qiladi:
^ERRORkabi naqshlarmbilan ishlatiladi. Terminaldagigrep "^const"ham aynan shu langar. - Matn muharrirlari. VS Code'da "Find and Replace" oynasida regex rejimini yoqib,
\bvar\bniletga almashtirish mumkin —variableichidagivartegilmaydi. - Intervyu. "Nega tekshiruv regex'ida langarlar kerak?", "
mflagi nima qiladi?", "\bqanday ishlaydi?" — klassik savollar.
Xulosa
- Langarlar belgi emas, joyni tekshiradi — nol kenglikda, moslikka belgi qo'shmaydi.
^— matn boshi,$— matn oxiri. Tekshiruv naqshi ikkalasi bilan o'raladi, qidiruv naqshi — langarsiz.- Langarsiz tekshiruv — xavfsizlik teshigi: to'g'ri bo'lak ortida begona matn o'tib ketadi. Qiymatni oldin
trim()qiling. mflagi bilan^va$har qatorda ishlaydi (\nva\r\nbo'yicha). JavaScript'da dollar belgisi oxirgi yangi qatordan oldin mos kelmaydi.\b—\wva\Worasidagi joy,\B— teskarisi; ular butun so'zni qidirish uchun.\bapostrof yonida yolg'on chegara ko'radi (bo'limdagilim) va kirill so'zlarida umuman ishlamaydi.
Keyingi dars: Quantifierlar: greedy va lazy — \d\d\d o'rniga \d{3}, "ixtiyoriy" belgi ? va regex nega "ochko'z" ekanini ko'ramiz.
Manbalar
- MDN: "Assertions" (Regular expressions guide), "RegExp.prototype.multiline" — developer.mozilla.org
- HTML Living Standard: "The pattern attribute" — html.spec.whatwg.org
- OWASP: "Input Validation Cheat Sheet" — cheatsheetseries.owasp.org
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!