6 сентябр 2025

Miqdorchilar +, *, ? va {n}

Aytaylik, bizda +7(903)-123-45-67 kabi satr bor va unda barcha raqamlarni topishni xohlaymiz. Lekin avvalgidan farqli o’laroq, biz alohida raqamlar emas, balki to’liq raqamlar bilan qiziqamiz: 7, 903, 123, 45, 67.

Raqam – bu 1 yoki undan ko’p raqamlar ketma-ketligi \d. Qanchasi kerakligini belgilash uchun miqdorchi qo’shishimiz mumkin.

Miqdor {n}

Eng oddiy miqdorchi – jingalak qavs ichidagi raqam: {n}.

Miqdorchi belgi (yoki belgilar sinfi, yoki [...] to’plam va hokazo)ga qo’shiladi va qancha kerakligini belgilaydi.

Uning bir nechta ilg’or shakllari bor, misollarni ko’raylik:

Aniq son: {5}

\d{5} aynan 5 ta raqamni bildiradi, \d\d\d\d\d bilan bir xil.

Quyidagi misol 5 xonali raqamni qidiradi:

alert( "I'm 12345 years old".match(/\d{5}/) ); //  "12345"

Uzunroq raqamlarni chiqarib tashlash uchun \b qo’shishimiz mumkin: \b\d{5}\b.

Diapazon: {3,5}, 3-5 marta mos keladi

3 dan 5 gacha raqamlarni topish uchun chegaralarni jingalak qavslarga qo’yishimiz mumkin: \d{3,5}

alert( "I'm not 12, but 1234 years old".match(/\d{3,5}/) ); // "1234"

Yuqori chegarani tashlab qo’yishimiz mumkin.

Keyin \d{3,} regexp uzunligi 3 yoki undan ko’p raqamlar ketma-ketligini qidiradi:

alert( "I'm not 12, but 345678 years old".match(/\d{3,}/) ); // "345678"

+7(903)-123-45-67 satriga qaytaylik.

Raqam – bu bir yoki undan ko’p raqamlarning ketma-ketligi. Demak, regexp \d{1,}:

let str = "+7(903)-123-45-67";

let numbers = str.match(/\d{1,}/g);

alert(numbers); // 7,903,123,45,67

Qisqartmalar

Ko’p ishlatiladigan miqdorchilar uchun qisqartmalar mavjud:

+

“Bir yoki ko’p” degani, {1,} bilan bir xil.

Masalan, \d+ raqamlarni qidiradi:

let str = "+7(903)-123-45-67";

alert( str.match(/\d+/g) ); // 7,903,123,45,67
?

“Nol yoki bir” degani, {0,1} bilan bir xil. Boshqacha qilib aytganda, belgini ixtiyoriy qiladi.

Masalan, ou?r naqshi o dan keyin nol yoki bitta u, keyin r ni qidiradi.

Shunday qilib, colou?r ham color ham colour ni topadi:

let str = "Should I write color or colour?";

alert( str.match(/colou?r/g) ); // color, colour
*

“Nol yoki ko’p” degani, {0,} bilan bir xil. Ya’ni belgi istalgan marta takrorlanishi yoki umuman bo’lmasligi mumkin.

Masalan, \d0* raqamdan keyin istalgan miqdordagi nollarni qidiradi (ko’p yoki hech bo’lmasligi mumkin):

alert( "100 10 1".match(/\d0*/g) ); // 100, 10, 1

Uni + (bir yoki ko’p) bilan solishtiring:

alert( "100 10 1".match(/\d0+/g) ); // 100, 10
// 1 mos kelmadi, chunki 0+ kamida bitta nol talab qiladi

Ko’proq misollar

Miqdorchilar juda tez-tez ishlatiladi. Ular murakkab doimiy ifodalarning asosiy “qurilish bloki” vazifasini bajaradi, shuning uchun ko’proq misollarni ko’raylik.

O’nli kasrlar uchun regexp (suzuvchi nuqtali raqam): \d+\.\d+

Amalda:

alert( "0 1 12.345 7890".match(/\d+\.\d+/g) ); // 12.345

Atributsiz “HTML tegi ochish” uchun regexp, masalan <span> yoki <p>.

  1. Eng oddiyi: /<[a-z]+>/i

    alert( "<body> ... </body>".match(/<[a-z]+>/gi) ); // <body>

    Regexp '<' belgisini, keyin bir yoki ko’p lotin harflarini, keyin '>' ni qidiradi.

  2. Yaxshilangan: /<[a-z][a-z0-9]*>/i

    Standartga ko’ra, HTML teg nomi birinchisidan tashqari istalgan pozitsiyada raqamga ega bo’lishi mumkin, masalan <h1>.

    alert( "<h1>Hi!</h1>".match(/<[a-z][a-z0-9]*>/gi) ); // <h1>

“Atributsiz HTML tegi ochish yoki yopish” uchun regexp: /<\/?[a-z][a-z0-9]*>/i

Biz naqsh boshiga ixtiyoriy qiyshiq chiziq /? qo’shdik. Uni teskari chiziq bilan ekranlashga to’g’ri keldi, aks holda JavaScript uni naqsh oxiri deb o’ylaydi.

alert( "<h1>Hi!</h1>".match(/<\/?[a-z][a-z0-9]*>/gi) ); // <h1>, </h1>
Regexpni aniqroq qilish uchun ko’pincha uni murakkabroq qilishimiz kerak

Bu misollarda umumiy qoidani ko’rishimiz mumkin: doimiy ifoda qanchalik aniq bo’lsa – shunchalik uzun va murakkab.

Masalan, HTML teglar uchun biz oddiyroq regexpdan foydalanishimiz mumkin: <\w+>. Lekin HTML teg nomi uchun qattiqroq cheklovlarga ega bo’lgani uchun, <[a-z][a-z0-9]*> ishonchlirog’.

<\w+> ishlatamizmi yoki <[a-z][a-z0-9]*> kerakmi?

Haqiqiy hayotda ikkala variant ham qabul qilinadi. Bu “qo’shimcha” mosliklarga qanchalik toqat qilishimiz va ularni boshqa usullar bilan natijadan olib tashlash qiyin yoki yoqligiga bog’liq.

Vazifalar

muhimlik: 5

Ellipsni topish uchun regexp yarating: ketma-ket 3 (yoki undan ko’p?) nuqta.

Tekshiring:

let regexp = /your regexp/g;
alert("Salom!... Qalay ketyapti?.....".match(regexp)); // ..., .....

Yechim:

let regexp = /\.{3,}/g;
alert("Salom!... Qanday ketyapti?.....".match(regexp)); // ..., .....

Esda tutingki, nuqta maxsus belgidir, shuning uchun biz undan qochishimiz va \. sifatida kiritishimiz kerak.

#ABCDEF sifatida yozilgan HTML ranglarini qidirish uchun regexp yarating: avval # va keyin 6 o’n oltilik belgilar.

Misol:

let regexp = /...sizning regexp.../;

let str =
  "color:#121212; background-color:#AA00ef bad-colors:f#fddee #fd2 #12345678";

alert(str.match(regexp)); // #121212,#AA00ef

P.S. Bu vazifada bizga #123 yoki rgb(1,2,3) va hokazo kabi boshqa rang formatlari kerak emas.

Biz # dan keyin 6 o’n oltilik belgini izlashimiz kerak.

O‘n oltilik belgini [0-9a-fA-F] deb ta’riflash mumkin. Yoki i bayrog’idan foydalansak, shunchaki [0-9a-f].

Keyin {6} kvantifikatori yordamida ulardan 6 tasini izlashimiz mumkin.

Natijada, bizda regexp mavjud: /#[a-f0-9]{6}/gi.

let regexp = /#[a-f0-9]{6}/gi;

let str = "color:#121212; background-color:#AA00ef bad-colors:f#fddee #fd2";

alert(str.match(regexp)); // #121212,#AA00ef

Muammo shundaki, u rangni uzunroq ketma-ketlikda topadi:

alert("#12345678".match(/#[a-f0-9]{6}/gi)); // #123456

Buni tuzatish uchun oxiriga \b qo’shishimiz mumkin:

// rang
alert("#123456".match(/#[a-f0-9]{6}\b/gi)); // #123456

// rang emas
alert("#12345678".match(/#[a-f0-9]{6}\b/gi)); // null
O'quv qo'llanma xaritasi

Izohlar

izoh berishdan oldin buni o'qing…
  • Agar sizda nimani yaxshilash kerakligi haqida takliflaringiz bo'lsa - iltimos, GitHub muammosini yuboring yoki izoh berish o'rniga so'rov yuboring.
  • Agar siz maqolada biror narsani tushunolmasangiz - iltimos, batafsilroq ma'lumot bering.
  • Bir nechta so'z so'zlarini kiritish uchun <code> yorlig'ini ishlating, bir nechta satrlar uchun - ularni <pre> yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepen…)