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":
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 natijalari (tutib olish)
Har bir (...) guruh mos kelgan qismni alohida saqlaydi. str.match(regexp) (bayroqsiz, g siz) chaqirilganda natija massivi qaytadi:
[0]โ butun mos kelish (to'liq topilgan matn);[1]โ birinchi guruh mazmuni;[2]โ ikkinchi guruh mazmuni, va hokazo.- Guruhlar ochiluvchi qavs tartibida raqamlanadi.
Masalan, HTML tegdan uning nomini ajratamiz. <(\w+)> โ butun teg tutiladi, ichidagi (\w+) esa tegning nomini alohida saqlaydi:
Ichma-ich (ugniyalangan) guruhlar ham bo'lishi mumkin. Sana 2026-07-01 ni ajratamiz โ butun sana bitta guruhda, yil/oy/kun esa alohida guruhlarda:
(...)?) 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):
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 guruhlar kod o'qilishini ancha yaxshilaydi: m.groups.yil deb yozish m[1] dan tushunarliroq va guruhlar tartibi o'zgarsa ham buzilmaydi.
replace da guruhlardan foydalanish
str.replace(regexp, o'rniga) da almashtiruvchi matn ichida guruhlarga murojaat qilish mumkin:
$1,$2, ... โ mos raqamli guruh mazmuni;$<name>โ nomli guruh mazmuni;$&โ butun mos kelish;$$โ oddiy dollar belgisi ($).
Sana formatini yil-oy-kun dan kun.oy.yil ga o'zgartiramiz. Raqamli guruhlar bilan:
Xuddi shu ish nomli guruhlar bilan โ ancha o'qilishli:
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:
(?:...) ni ishlatish kod aniqligini oshiradi va katta shablonlarda ozgina tezlik beradi, chunki dvigatel keraksiz qismlarni saqlab yurmaydi.Xulosa
(...)โ qismni guruhlaydi va uning mazmunini tutib oladi;- Guruhlar ochiluvchi qavs tartibida raqamlanadi:
match[1],match[2], ...; gbilan barcha guruhlarni olish uchunmatchAllishlatiladi;- Nomli guruh:
(?<name>...)->match.groups.name; replaceda:$1,$<name>,$&,$$;(?:...)โ tutmaydigan guruh: faqat guruhlaydi, lekin natijaga tushmaydi.