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)yaynangr[ae]ybilan bir xil ma’noni bildiradi.gra|eygrayokieyni bildiradi.
Naqshning tanlangan qismiga alternatsiyani qo’llash uchun uni qavslarga o’rashimiz mumkin:
I love HTML|CSSI love HTMLyokiCSSga mos keladi.I love (HTML|CSS)I love HTMLyokiI love CSSga 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
0yoki1bo’lsa, keyingi raqam har qanday bo’lishi mumkin:[01]\d. - Aks holda, agar birinchi raqam
2bo’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
Izohlar
<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…)