IlmHamroh
JavaScript Full-stack/12-qism. JavaScript: ilg'or mavzular va kod sifati3/44-dars17 daqiqa
Mundarija (38)

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, m flagi bilan esa ular har bir qator boshi va oxirida ishlaydi. \b — so'z chegarasi: /\bosh\b/ osh ni topadi, oshxona ichidagini 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.
  • m flagi bilan ko'p qatorli matnning har qatorida qidirasiz.
  • \b va \B bilan butun so'zni qidirasiz va so'z ichidagisini ajratasiz.
  • \b o'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:

js
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")); // true

Uchala 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:

js
console.log(/^Osh/.test("Osh — 35000 so'm")); // true
console.log(/^Osh/.test("Bugun Osh bor")); // false

Ikkinchi 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:

js
console.log(/so'm$/.test("Osh — 35000 so'm")); // true
console.log(/so'm$/.test("35000 so'm dan")); // false

Narxlar ro'yxatidan oxirgi sonni olish uchun ham qulay:

js
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:

js
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")); // false

Endi 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:

js
const ismNaqshi = /^[A-Za-z' ]+$/;

console.log(ismNaqshi.test("G'ayrat")); // true
console.log(ismNaqshi.test("Ali2")); // false
console.log(ismNaqshi.test("")); // false

O'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.

js
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")); // false

Naqshni 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 qiymat trim() 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:

js
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)); // true

Hujumchi 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:

js
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)); // false

Qoidalar:

  • Tekshiruv regex'i — ^ bilan boshlanadi, $ bilan tugaydi.
  • Tekshiruv yagona himoya emas: qiymat baribir textContent bilan chiqariladi, innerHTML bilan 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:

text
Osh 35000
Lag'mon 28000
Manti 30000

Har 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:

js
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:

js
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:

js
console.log(/^osh$/.test("osh\n")); // false
console.log(/^osh$/m.test("osh\n")); // true

Fayldan 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? m flagi 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:

js
const tavsif = "Choy, choyxona, ko'k choy";

console.log(tavsif.replace(/choy/gi, "CHOY"));
console.log(tavsif.replace(/\bchoy\b/gi, "CHOY"));

Konsolda:

text
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":

js
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":

js
const matn = "osh Toshkent oshxona";

console.log(matn.replace(/\Bosh/g, "[$&]")); // osh T[osh]kent oshxona

Faqat 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:

js
const matn = "bo'lim lim";

console.log(matn.match(/\blim\b/g)); // [ 'lim', 'lim' ]
console.log(matn.replace(/\blim\b/g, "X")); // bo'X X

Biz 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:

js
console.log("Ош ош".match(/\bош\b/g)); // null

Ikkala 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, \b ga 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.

js
console.log(vaqtTogrimi(" 07:00 ")); // true
console.log(vaqtTogrimi("7:00")); // false
console.log(vaqtTogrimi("07:00 da")); // false
Yechim
js
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")); // false

7: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.

js
const menyu = "Osh 35000\nLag'mon 28000\nKo'k choy 5000";
// Eng qimmati: 35000
Yechim
js
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:

text
Eng qimmati: 35000

m 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.

js
const tavsif = "Choy tayyor, choyxona ochiq";
console.log(sozniAlmashtir(tavsif, "choy", "kofe"));
// kofe tayyor, choyxona ochiq
Yechim
js
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:

text
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
js
const matn = "Sut#2 olish #bozor #do'kon";

console.log(matn.match(/#[\w']+/g));
console.log(matn.match(/\B#[\w']+/g));

Konsolda:

text
[ '#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.

bash
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: ^ERROR kabi naqshlar m bilan ishlatiladi. Terminaldagi grep "^const" ham aynan shu langar.
  • Matn muharrirlari. VS Code'da "Find and Replace" oynasida regex rejimini yoqib, \bvar\b ni let ga almashtirish mumkin — variable ichidagi var tegilmaydi.
  • Intervyu. "Nega tekshiruv regex'ida langarlar kerak?", "m flagi nima qiladi?", "\b qanday 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.
  • m flagi bilan ^ va $ har qatorda ishlaydi (\n va \r\n bo'yicha). JavaScript'da dollar belgisi oxirgi yangi qatordan oldin mos kelmaydi.
  • \b — \w va \W orasidagi joy, \B — teskarisi; ular butun so'zni qidirish uchun.
  • \b apostrof yonida yolg'on chegara ko'radi (bo'lim dagi lim) 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
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Regex langarlari: ^, $, \b va m flag — IlmHamroh