Muntazam ifodalar (RegExp)

Guruhlash va tutish

Muntazam ifodada bir qism belgilarni yumaloq qavs (...) ichiga olsak, ular guruhga aylanadi. Guruhlar ikki foyda beradi: birinchidan, kvantorni bir necha belgiga birdan qo'llash imkonini beradi; ikkinchidan, mos kelgan qismni alohida tutib olib (capture), keyinchalik ishlatish imkonini beradi.

Guruhga kvantor qo'llash

Qavssiz kvantor faqat bitta belgiga ta'sir qiladi. Qavs bilan esa butun ketma-ketlikni takrorlashimiz mumkin. Masalan, (go)+ โ€” bir yoki undan ko'p "go":

guruh-kvantor.js
// natija shu yerda chiqadi

Amaliy misol โ€” domen nomi. Domen nuqta bilan ajratilgan bo'laklardan iborat, masalan mail.google.com. "So'z + nuqta" bo'lagini (\w+\.)+ deb guruhlab, keyin oxirgi bo'lakni qo'shamiz:

guruh-domen.js
// natija shu yerda chiqadi

Guruh natijalari (tutib olish)

Har bir (...) guruh mos kelgan qismni alohida saqlaydi. str.match(regexp) (bayroqsiz, g siz) chaqirilganda natija massivi qaytadi:

Masalan, HTML tegdan uning nomini ajratamiz. <(\w+)> โ€” butun teg tutiladi, ichidagi (\w+) esa tegning nomini alohida saqlaydi:

guruh-match.js
// natija shu yerda chiqadi

Ichma-ich (ugniyalangan) guruhlar ham bo'lishi mumkin. Sana 2026-07-01 ni ajratamiz โ€” butun sana bitta guruhda, yil/oy/kun esa alohida guruhlarda:

guruh-ichmaich.js
// natija shu yerda chiqadi
Agar guruh ixtiyoriy (masalan (...)?) bo'lib, mos kelmasa, uning natijasi massivda undefined bo'ladi. Guruhning raqami esa o'zgarmaydi โ€” u qavs tartibi bo'yicha aniqlanadi.

matchAll bilan barcha guruhlar

g bayrog'i bilan oddiy match guruhlarni yo'qotadi โ€” u faqat butun mos kelishlar ro'yxatini qaytaradi. Barcha mos kelishlarni va ularning guruhlarini olish uchun str.matchAll(regexp) ishlatiladi (u iterator qaytaradi):

guruh-matchall.js
// natija shu yerda chiqadi
matchAll iterator qaytaradi. To'liq massiv kerak bo'lsa, Array.from(str.matchAll(re)) yoki [...str.matchAll(re)] ishlatiladi.

Nomli guruhlar (?)

Guruhlarni raqam bo'yicha eslab yurish noqulay. Ularga nom berish mumkin: qavs boshiga ?<name> qo'yiladi. Natijada guruh match.groups obyektida nom bo'yicha ochiladi:

nomli-guruh.js
// natija shu yerda chiqadi

Nomli guruhlar kod o'qilishini ancha yaxshilaydi: m.groups.yil deb yozish m[1] dan tushunarliroq va guruhlar tartibi o'zgarsa ham buzilmaydi.

nomli-guruh-hammasi.js
// natija shu yerda chiqadi

replace da guruhlardan foydalanish

str.replace(regexp, o'rniga) da almashtiruvchi matn ichida guruhlarga murojaat qilish mumkin:

Sana formatini yil-oy-kun dan kun.oy.yil ga o'zgartiramiz. Raqamli guruhlar bilan:

replace-raqamli.js
// natija shu yerda chiqadi

Xuddi shu ish nomli guruhlar bilan โ€” ancha o'qilishli:

replace-nomli.js
// natija shu yerda chiqadi

Tutmaydigan guruh (?:...)

Ba'zan guruh faqat kvantor qo'llash uchun kerak, lekin uning mazmunini saqlashni istamaymiz. Bunday guruhni ?: bilan boshlaymiz โ€” u tutmaydigan (non-capturing) bo'ladi va natija massiviga tushmaydi.

Masalan, "go" takrorini tutamiz, lekin faqat oxirida qolgan so'z kerak. Oddiy guruh keraksiz [1] yaratadi:

tutmaydigan-guruh.js
// natija shu yerda chiqadi
(?:...) ni ishlatish kod aniqligini oshiradi va katta shablonlarda ozgina tezlik beradi, chunki dvigatel keraksiz qismlarni saqlab yurmaydi.

Xulosa