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
aynangr[ae]y
bilan bir xil ma’noni bildiradi.gra|ey
gra
yokiey
ni bildiradi.
Naqshning tanlangan qismiga alternatsiyani qo’llash uchun uni qavslarga o’rashimiz mumkin:
I love HTML|CSS
I love HTML
yokiCSS
ga mos keladi.I love (HTML|CSS)
I love HTML
yokiI 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
yoki1
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
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…)