Regular expressions

Regular expression (yana regex, regexp) – qidirish patternini belgilab beruvchi belgilar ketma-ketligi. Odatda regex’lar matn ichida qidiruv algoritmlarida so’zlarni topish (find), topish va almashtirish (find & replace), hamda kiritilgan ma’lumotni tekshirish uchun ishlatiladi.

Regular expressions’ni ifodalash uchun bir necha amallar kiritilgan.

AmalTartibiREga misolMos keladiMos kelmaydi
concatenation3AABAABAABAABboshqa so’zlar
or4AA|BAABAA
BAAB
boshqa so’zlar
closure2AB*AAA
ABBBBBBBA
AB
ABABA
parenthesis1A(A|B)AABAAAAB
ABAAB
boshqa so’zlar
parenthesis1(AB)*AA
ABABABABA
AA
ABBA

Concatenation. Aniq bir so’zni ifodalaydi. Boshqa so’zlar uchrasa mos kelmagan hisoblanadi.

Or. Ishlashi koddagi or operatori bilan bir xil – | belgisi uning ikki tarafidagi shartdan biri mos kelishini tekshiradi. Masalan, AA|BAAB regex uchun AA yoki BAAB so’zlari mos keladi.

Closure. * belgisi bilan ifodalanuvchi amal o’zidan avvalgi belgi yoki birikmaning nol yoki istalgan miqdorda kelishini belgilaydi. Masalan, AB*A regex’da B yo’q yoki birnecha marta qatnashgan so’zlar mos keladi: AA, ABA, ABBBBA

Parenthesis. Qavslar bilan ifodalanib, ichidagi amalning birinchi bo’lib ishlashini ta’minlaydi (huddi matematika va dasturlashdagi kabi). Masalan, (AB)*A regex uchun AB yo’q yoki bir necha marta qatnashgan hamda A bilan tugagan so’zlar mos keladi: AA, ABA, ABABABA. Agar qavslar qo’yilmaganda, ya’ni AB*A holatida AA, ABA, ABBBAA so’zlarini topgan bo’lardi.

Amallarning bajarilish tartibi – parenthesis (1), closure (2), or (3), concatenation (4).

Qo’shimcha amallar

Shuningdek, qulaylik uchun qo’shimcha amallar ham kiritilgan.

AmalREga misolMos keladiMos kelmaydi
wildcard.U.U.U.CUMULUS
JUGULUM
SUCCUBUS
TUMULTUOUS
character class
(Ranges)
[A-Za-z][a-z]*word
Capitalized
camelCase
4illegal
kamida bittaA(BC)+DEABCDE
ABCBCDE
ADE
BCDE
aniq miqdorda[0-9]{5}-[0-9]{4}08540-1321
19072-5541
1111111111
166-54-111

Qulayligi – ba’zi holatlarda uzun regex’ni qisqartirilgan shaklda yozish imkoniyati borligida. Masalan (A|B|C|D|E)(A|B|C|D|E)* ni qisqacha qilib [A-E]+ ko’rinishida yozsa bo’ladi.

Flags

AmalREga misolMos keladiMos kelmaydi
g (global)/abc/gabcboshqa so’zlar
i (case insensitive)/abc/iabc, Abc, ABc, ABC
aBc, aBC, abC
boshqa so’zlar
m (multiline search)/abc/mabcboshqa so’zlar
u (unicode support)
s (single line)

Character groups

To’rtburchak qavs ichiga olingan belgilar – belgilar guruhi (character groups) deyiladi. Bunda ulardan biri uchrasa yetarli bo’ladi. Masalan [hc]ello – hello va cello so’zlarini topadi. jello, ello so’zlari mos kelmaydi.

Negated character groups

Character groups bilan bir xil va ^ – negativ (inkor qiluvchi) belgi qo’shiladi. Bunda to’rtburchak qavs ichida berilgan belgilar yo’q bo’lsa regex mos keladi. Masalan, [^hc]ello uchun hello va cello so’zlari topilmaydi, jello so’zi mos keladi.

Multiple range item matches

Agar berilgan range ichidan faqat bitta belgini topish kerak bo’lsa ^ va $ belgilaridan foydalaniladi.

/^[A-Z]$/.test('A') // true
/^[A-Z]$/.test('AB') // false
/^[A-Z]$/.test('Ab') // false
/^[A-Z-0-9]$/.test('1') // true
/^[A-Z-0-9]$/.test('A1') // false

Meta-characters

\d: istalgan raqam uchun, [0-9] bilan teng.

\D: istalgan raqam bo’lmagan belgi uchun, [^0-9] bilan teng.

\w: istalgan alphanumeric belgi va «_» (underscore) uchun, [A-Za-z_0-9] bilan teng.

\W: istalgan alphanumeric belgi va «_» (underscore) bo’lmagan holat uchun, [^A-Za-z_0-9] bilan teng.

\s: probel (whitespace) belgilar uchun: space, tab, yangi qator va unicode space.

\S: whitespace bo’lmagan belgilar uchun.

\0: null uchun mos keladi.

\n: yangi qator uchun mos keladi.

\t: tab uchun mos keladi.

\uXXXX: XXXX kodli unicode belgi uchun mos keladi (\u bo’lishi majburiy).

. (nuqta): yangi qatordan tashqari istalgan belgi uchun mos keladi (wildcard).

[^]: istalgan belgi uchun mos keladi (yangi qator belgisi – \n ni ham o’z ichiga oladi).

Quantifiers

|, {}, * va + quantifier’lar haqida yuqorida to’xtaldik. Qolganlari bilan tanishamiz.

?: o’zidan oldingi belgini 0 va undan ko’p marta qaytarilishi mumkinligini belgilaydi. * bilan o’xshash.

var regex = /hii?d/;
console.log(regex.test('hid')); // true
console.log(regex.test('hiid')); // true
console.log(regex.test('hiiid')); // false

^: matnning boshini mos kelishini aniqlaydi.

var regex = /^h/;
console.log(regex.test('hi')); // true
console.log(regex.test('bye')); // false

$: matnning ohiri mos kelishini aniqlaydi.

var regex = /.com$/;
console.log(regex.test('test@email.com')); // true
console.log(regex.test('test@email')); // false

{N,} kamida N ta belgi bo’lishini tekshiradi.

var regex = /hi{2,}d/;
console.log(regex.test('hiid')); // true
console.log(regex.test('hiiid')); // true

{N,M}: belgining minimum N, maksimum M marta bo’lishini tekshiradi.

var regex = /hi{1,2}d/;
console.log(regex.test('hid')); // true
console.log(regex.test('hiid')); // true
console.log(regex.test('hiiid')); // false

Regex’ni tekshirish yoki biror noodatiy regex ishlab chiqish uchun onlayn servislar talaygina. Kamina regextester.comni ishlataman.

Keyingi mavzular regular expressions uchun algoritmlar haqida bo’ladi.