Regex — matn ichidagi belgilar ketma-ketligini qoidalar asosida topish, tekshirish, ajratish yoki almashtirish uchun ishlatiladigan ifoda tili. Uning to‘liq nomi Regular Expression hisoblanadi.
Regex email, log, URL, identifikator, raqam, sana va boshqa matn shakllarini qayta ishlashda qo‘llanadi. U oddiy substring qidiruvdan kuchliroq, chunki aniq matn bilan birga variantlar va takrorlanishlarni ham ifodalaydi.
Literal belgi
Oddiy harf va raqam ko‘pincha o‘zini bildiradi.
cat
ifodasi cat ketma-ketligini qidiradi.
Regex engine odatda matnning istalgan joyidan moslik topadi. Butun satr mosligini talab qilish uchun anchor ishlatiladi.
Metabelgilar
Quyidagi belgilar ko‘p regex dialectida maxsus ma’noga ega:
. ^ $ * + ? { } [ ] ( ) | \
Ularning literal ko‘rinishini qidirish uchun escape ishlatiladi.
Masalan:
\.
nuqta belgisini bildiradi, oddiy . esa ko‘pincha newline’dan tashqari istalgan bitta belgiga mos keladi.
Character class
Square bracket ichidagi to‘plam bitta belgini tanlaydi.
[abc]
a, b yoki cga mos.
Range:
[a-z]
[0-9]
Negation:
[^0-9]
raqam bo‘lmagan bitta belgiga mos.
Range Unicode va locale bilan bir xil ishlashi barcha engine’da kafolatlanmaydi.
Tayyor klasslar
Ko‘p engine qisqa klasslarni qo‘llaydi:
\d— raqam;\w— word character;\s— whitespace;\D,\W,\S— inkor variantlari.
\w faqat ASCII yoki Unicode harflarini ham qamrashi engine va flagga bog‘liq.
Quantifier
Oldingi element necha marta takrorlanishini belgilaydi.
* 0 yoki ko‘p
+ 1 yoki ko‘p
? 0 yoki 1
{3} aynan 3
{2,5} 2 dan 5 gacha
{2,} kamida 2
Misol:
a+
a, aa, aaa kabi ketma-ketliklarga mos.
Greedy va lazy
Quantifier odatda imkon qadar ko‘p matnni oladi. Bu greedy xatti-harakat.
<.*>
<b>text</b> matnida butun qatorni olishi mumkin.
Lazy variant:
<.*?>
eng qisqa moslikni tanlaydi.
Lazy regex ham noto‘g‘ri strukturalangan HTMLni ishonchli parser o‘rnida qayta ishlay olmaydi.
Anchor
Anchor belgining o‘ziga emas, joylashuvga mos keladi.
^— satr yoki input boshi;$— satr yoki input oxiri;\b— word boundary;\A,\z— ayrim engine’da butun input chegarasi.
Validation uchun:
^[0-9]{6}$
faqat olti raqamdan iborat butun satrni tekshiradi.
Group
Parenthesis subexpressionni guruhlaydi.
(ab)+
ab, abab va boshqa takrorlarga mos.
Capturing group mos bo‘lgan bo‘lakni alohida saqlaydi.
([0-9]{4})-([0-9]{2})-([0-9]{2})
yil, oy va kunni uch guruhga ajratadi.
Non-capturing group
Faqat guruhlash kerak, natijani saqlash shart bo‘lmasa:
(?:ab)+
ishlatilishi mumkin.
Bu group raqamlari o‘zgarishini va keraksiz capture xarajatini kamaytiradi.
Alternation
Vertical bar variantlardan birini tanlaydi.
cat|dog
cat yoki dog.
Precedence sabab:
^(cat|dog)$
butun satrni ikki variantdan biri bilan cheklaydi.
Backreference
Oldin capture qilingan matnni qayta talab qiladi.
(["']).*?\1
bir xil quote bilan ochilib-yopiladigan matnga yaqin pattern.
Backreference regular language chegarasidan chiqishi mumkin va engine performance’iga ta’sir qiladi.
Lookaround
Lookahead va lookbehind matnni tekshiradi, ammo match tarkibiga qo‘shmaydi.
Misol:
\d+(?= USD)
USDdan oldingi raqamni oladi.
Barcha engine variable-length lookbehindni qo‘llamaydi.
Flag
Regex flaglari xatti-harakatni o‘zgartiradi.
Keng tarqalganlari:
- case-insensitive;
- multiline;
- dotall;
- Unicode;
- verbose;
- global.
multiline ^ va $ni har qatorga, dotall esa .ni newline’ga ham mos qilishi mumkin.
Engine turlari
Regex engine’lar ikki asosiy yondashuvga ega.
DFA yoki avtomatga yaqin
Ko‘pincha linear vaqtga yaqin va xavfsizroq, ammo backreference kabi imkoniyatlar cheklangan.
Backtracking engine
Boy syntax va capture imkoniyatiga ega, ammo ayrim patternlarda exponential vaqt sarflashi mumkin.
Dialect va engine farqini bilish muhim.
Catastrophic backtracking
Noto‘g‘ri nested quantifier input mos kelmaganda juda ko‘p variantni tekshirishi mumkin.
Misolga o‘xshash xavfli tuzilma:
(a+)+$
uzun aaaa...! inputda juda sekinlashishi mumkin.
Bu ReDoS — Regular Expression Denial of Service xavfiga olib keladi.
Validation cheklovi
Regex formatni tekshiradi, lekin ma’no va business qoidani to‘liq tekshirmaydi.
Sana:
2026-99-99
shaklan mos, ammo haqiqiy sana emas.
Format regex bilan, semantik qiymat parser yoki domain validator bilan tekshiriladi.
Replacement
Regex capture guruhlari replacementda ishlatiladi.
Masalan, ism tartibini almashtirish:
Sherkulov, Farrukh
pattern guruhlariga ajratilib:
Farrukh Sherkulov
ko‘rinishiga o‘tkaziladi.
Replacement sintaksisi engine’ga qarab $1, \1 yoki nomlangan group bo‘lishi mumkin.
Regex va parser
Regex flat yoki cheklangan patternlar uchun qulay.
Nested va rekursiv tuzilma:
uchun maxsus parser ishonchliroq.
Ba’zi engine recursion qo‘llasa ham, format specificationni to‘liq amalga oshirish murakkab.
Diagnostika
Regex ishlamasa quyidagilar tekshiriladi:
- dialect;
- escaping;
- string literal ichidagi qo‘shimcha escape;
- anchor;
- greedy quantifier;
- flag;
- Unicode;
- newline;
- group raqami;
- performance;
- input uzunligi.
Regex testeri real runtime engine va flaglar bilan bir xil bo‘lishi kerak.
Compiled regex
Bir pattern ko‘p marta ishlatilsa engine uni oldindan compile qilib internal automaton yoki instructionlarga aylantirishi mumkin. Compile xarajati bir marta, matching esa qayta ishlatiladi.
Input chegarasi
Untrusted input uchun xavfsiz patternning o‘zi ham juda katta matnda ko‘p CPU sarflashi mumkin. Input uzunligi, match soni va execution timeouti alohida cheklanadi.
Bog‘liq tushunchalar
Regular Expression, Pattern matching, Character class, Quantifier, Capturing group, Lookaround, Backtracking, ReDoS, Lexer, Parser