Bosh sahifa Wiki Regex

Regex

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