Ushbu ochiq manbali loyihani butun dunyo bo'ylab odamlar uchun taqdim etmoqchimiz.

Ushbu qo'llanmaning mazmuni sizning tilingizga tarjima qilishga yordam bering!

6 сентябр 2025

Alternatsiya (OR) |

Alternatsiya – bu doimiy ifodalardagi atama bo’lib, aslida oddiy "YOKI" degani.

Doimiy ifodada u vertikal chiziq belgisi | bilan belgilanadi.

Masalan, bizga dasturlash tillari kerak: HTML, PHP, Java yoki JavaScript.

Tegishli regexp: html|php|java(script)?.

Foydalanish misoli:

let regexp = /html|php|css|java(script)?/gi; let str = "First HTML appeared, then CSS, then JavaScript"; alert( str.match(regexp) ); // 'HTML', 'CSS', 'JavaScript'

Biz shunga o’xshash narsani allaqachon ko’rganmiz – kvadrat qavslar. Ular bir nechta belgi orasidan tanlash imkonini beradi, masalan gr[ae]y gray yoki grey ga mos keladi.

Kvadrat qavslar faqat belgilar yoki belgilar sinflariga ruxsat beradi. Alternatsiya har qanday ifodalarga ruxsat beradi. A|B|C regexp A, B yoki C ifodalaridan birini bildiradi.

Masalan:

  • gr(a|e)y aynan gr[ae]y bilan bir xil ma’noni bildiradi.
  • gra|ey gra yoki ey ni bildiradi.

Naqshning tanlangan qismiga alternatsiyani qo’llash uchun uni qavslarga o’rashimiz mumkin:

  • I love HTML|CSS I love HTML yoki CSS ga mos keladi.
  • I love (HTML|CSS) I love HTML yoki I love CSS ga mos keladi.

Misol: vaqt uchun regexp

Oldingi maqolalarda hh:mm shaklida vaqtni qidirish uchun regexp yaratish vazifasi bor edi, masalan 12:00. Lekin oddiy \d\d:\d\d juda noaniq. U 25:99 ni vaqt sifatida qabul qiladi (99 daqiqa naqshga mos keladi, lekin bu vaqt noto’g’ri).

Yaxshiroq naqshni qanday yaratish mumkin?

Biz yanada ehtiyotkor moslashtirish ishlatishimiz mumkin. Birinchi, soatlar:

  • Agar birinchi raqam 0 yoki 1 bo’lsa, keyingi raqam har qanday bo’lishi mumkin: [01]\d.
  • Aks holda, agar birinchi raqam 2 bo’lsa, keyingi [0-3] bo’lishi kerak.
  • (boshqa birinchi raqamga ruxsat yo’q)

Biz alternatsiya yordamida ikkala variantni regexpda yozishimiz mumkin: [01]\d|2[0-3].

Keyin, daqiqalar 00 dan 59 gacha bo’lishi kerak. Doimiy ifodalar tilida buni [0-5]\d deb yozish mumkin: birinchi raqam 0-5, keyin har qanday raqam.

Agar soat va daqiqalarni birlashtirsak, naqsh hosil bo’ladi: [01]\d|2[0-3]:[0-5]\d.

Deyarli tugadik, lekin muammo bor. Alternatsiya | endi [01]\d va 2[0-3]:[0-5]\d orasida sodir bo’lyapti.

Ya’ni: daqiqalar ikkinchi alternatsiya variantiga qo’shilgan, mana aniq rasm:

[01]\d | 2[0-3]:[0-5]\d

Bu naqsh [01]\d yoki 2[0-3]:[0-5]\d ni qidiradi.

Lekin bu noto’g’ri, alternatsiya faqat doimiy ifodaning “soatlar” qismida ishlatilishi kerak, [01]\d YOKI 2[0-3] ga ruxsat berish uchun. Keling, buni "soatlar"ni qavslarga o’rash orqali tuzataylik: ([01]\d|2[0-3]):[0-5]\d.

Yakuniy yechim:

let regexp = /([01]\d|2[0-3]):[0-5]\d/g; alert("00:00 10:10 23:59 25:99 1:2".match(regexp)); // 00:00,10:10,23:59

Vazifalar

Ko’plab dasturlash tillari mavjud, masalan Java, JavaScript, PHP, C, C++.

Ularni Java JavaScript PHP C++ C satrida topadigan regexp yarating:

let regexp = /sizning regexpingiz/g; alert("Java JavaScript PHP C++ C".match(regexp)); // Java JavaScript PHP C++ C

Birinchi g’oya tillarni o’rtalarida | bilan ro’yxatlash bo’lishi mumkin.

Ammo bu to’g’ri ishlamaydi:

let regexp = /Java|JavaScript|PHP|C|C\+\+/g; let str = "Java, JavaScript, PHP, C, C++"; alert(str.match(regexp)); // Java,Java,PHP,C,C

Muntazam ifoda dvigateli alternativlarni birin-ketin qidiradi. Ya’ni: avval Java bor-yo’qligini tekshiradi, aks holda – JavaScript ni qidiradi va hokazo.

Natijada, JavaScript hech qachon topila olmaydi, chunki Java birinchi bo’lib tekshiriladi.

C va C++ bilan ham xuddi shunday.

Bu muammo uchun ikkita yechim bor:

  1. Uzunroq moslikni birinchi tekshirish uchun tartibni o’zgartirish: JavaScript|Java|C\+\+|C|PHP.
  2. Bir xil boshlanish bilan variantlarni birlashtirish: Java(Script)?|C(\+\+)?|PHP.

Amalda:

let regexp = /Java(Script)?|C(\+\+)?|PHP/g; let str = "Java, JavaScript, PHP, C, C++"; alert(str.match(regexp)); // Java,JavaScript,PHP,C,C++

“BB-teg” [tag]...[/tag] ko’rinishida bo’ladi, bu yerda tag quyidagilardan biri: b, url yoki quote.

Masalan:

[b]matn[/b] [url]http://google.com[/url]

BB-teglar ichma-ich joylashtirilishi mumkin. Ammo teg o’zi ichiga o’zini joylashtira olmaydi, masalan:

Normal: [url] [b]http://google.com[/b] [/url] [quote] [b]matn[/b] [/quote] Bo'lishi mumkin emas: [b][b]matn[/b][/b]

Teglar qator uzilishlarini o’z ichiga olishi mumkin, bu normal:

[quote] [b]matn[/b] [/quote]

Barcha BB-teglarni ularning tarkibi bilan topish uchun regexp yarating.

Masalan:

let regexp = /sizning regexpingiz/flags; let str = "..[url]http://google.com[/url].."; alert( str.match(regexp) ); // [url]http://google.com[/url]

Agar teglar ichma-ich joylashgan bo’lsa, bizga tashqi teg kerak (agar xohlasak, uning tarkibida qidiruvni davom ettirishimiz mumkin):

let regexp = /sizning regexpingiz/flags; let str = "..[url][b]http://google.com[/b][/url].."; alert( str.match(regexp) ); // [url][b]http://google.com[/b][/url]

Ochuvchi teg \[(b|url|quote)\].

Keyin yopuvchi teggacha hamma narsani topish uchun – yangi qatorni ham o’z ichiga olgan har qanday belgiga mos kelish uchun s bayrog’i bilan .*? naqshidan foydalanamiz va keyin yopuvchi tegga orqaga havola qo’shamiz.

To’liq naqsh: \[(b|url|quote)\].*?\[/\1\].

Amalda:

let regexp = /\[(b|url|quote)\].*?\[\/\1\]/gs; let str = ` [b]salom![/b] [quote] [url]http://google.com[/url] [/quote] `; alert(str.match(regexp)); // [b]salom![/b],[quote][url]http://google.com[/url][/quote]

E’tibor bering, [ va ] ni escape qilishdan tashqari, yopuvchi teg [\/\1] uchun slashni ham escape qilishimiz kerak edi, chunki odatda slash naqshni yopadi.

Qo’sh qo’shtirnoq ichidagi satrlarni topish uchun regexp yarating "...".

Satrlar JavaScript satrlari kabi escaping ni qo’llab-quvvatlashi kerak. Masalan, qo’shtirnoqlar \" sifatida qo’shilishi mumkin, yangi qator \n sifatida va slash o’zi \\ sifatida.

let str = 'Xuddi "shu yerda" kabi.';

E’tibor bering, xususan, escaped qo’shtirnoq \" satrni tugatmaydi.

Shuning uchun biz bir qo’shtirnoqdan ikkinchisigacha yo’lda escaped qo’shtirnoqlarni e’tiborsiz qoldirib qidirishimiz kerak.

Bu vazifaning muhim qismi, aks holda u oddiy bo’lar edi.

Mos keladigan satrlar misollari:

.. "meni sinab ko'r" .. .. "\"Salom\" degin!" ... (ichida escaped qo'shtirnoqlar) .. "\\" .. (ichida qo'sh slash) .. "\\ \"" .. (ichida qo'sh slash va escaped qo'shtirnoq)

JavaScript da biz slashlarni satrga to’g’ri o’tkazish uchun ularni ikki marta yozishimiz kerak:

let str = ' .. "meni sinab ko'r" .. "\"Salom\" degin!" .. "\\\\ \\"" .. '; // xotiradagi satr alert(str); // .. "meni sinab ko'r" .. "\"Salom\" degin!" .. "\\ \"" ..

Yechim: /"(\\.|[^"\\])*"/g.

Bosqichma-bosqich:

  • Avval biz " ochilish iqtibosini qidiramiz
  • Agar bizda teskari qiyshiq chiziq \\ bo’lsa (bu maxsus belgi bo’lgani uchun uni naqshda ikki barobarga qo’yishimiz kerak), undan keyin har qanday belgi yaxshi bo’ladi (nuqta).
  • Aks holda biz qo’shtirnoq (bu qatorning oxirini bildiradi) va teskari chiziqdan tashqari har qanday belgini olamiz (yakka teskari qiyshiq chiziqning oldini olish uchun teskari chiziq faqat undan keyin boshqa belgi bilan ishlatiladi): [^"\\]
  • Yakunlovchi iqtibosgacha shunday.

Amalda:

let regexp = /"(\\.|[^"\\])*"/g; let str = '.. "meni sinab ko'ring" .. "\\"Salom\\" deb ayting!" .. "\\\\ \\"" ..'; alert(str.match(regexp)); // "meni sinab ko'ring","\"Salom\" deb ayt!","\\ \""

<style...> tegini topish uchun regexp yozing. U toʻliq tegga mos kelishi kerak: unda <style> atributlari boʻlmasligi yoki ularning bir nechtasi <style type="..." id="..."> boʻlishi mumkin.

…Lekin regexp <styler> bilan mos kelmasligi kerak!

Masala:

let regexp = /sizning regexp/g; alert('<style> <styler> <style test="...">'.match(regexp)); // <style>, <style test="...">

Naqsh boshlanishi aniq: <style.

Lekin biz shunchaki <style.*?> yoza olmaymiz, chunki <styler> unga mos keladi.

Bizga <styledan keyin bo’sh joy, so’ngra ixtiyoriy ravishda boshqa narsa yoki > tugashi kerak.

Regexp tilida: <style(>|\s.*?>).

Amalda:

let regexp = /<style(>|\s.*?>)/g; alert('<style> <styler> <style test="...">'.match(regexp)); // <style>, <style test="...">
O'quv qo'llanma xaritasi

Izohlar

izoh berishdan oldin buni o'qing…
  • Agar sizda nimani yaxshilash kerakligi haqida takliflaringiz bo'lsa - iltimos, GitHub muammosini yuboring yoki izoh berish o'rniga so'rov yuboring.
  • Agar siz maqolada biror narsani tushunolmasangiz - iltimos, batafsilroq ma'lumot bering.
  • Bir nechta so'z so'zlarini kiritish uchun <code> yorlig'ini ishlating, bir nechta satrlar uchun - ularni <pre> yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepen…)