Aytaylik, bizda +7(903)-123-45-67
kabi satr bor va unda barcha raqamlarni topishni xohlaymiz. Lekin avvalgidan farqli o’laroq, biz alohida raqamlar emas, balki to’liq raqamlar bilan qiziqamiz: 7, 903, 123, 45, 67
.
Raqam – bu 1 yoki undan ko’p raqamlar ketma-ketligi \d
. Qanchasi kerakligini belgilash uchun miqdorchi qo’shishimiz mumkin.
Miqdor {n}
Eng oddiy miqdorchi – jingalak qavs ichidagi raqam: {n}
.
Miqdorchi belgi (yoki belgilar sinfi, yoki [...]
to’plam va hokazo)ga qo’shiladi va qancha kerakligini belgilaydi.
Uning bir nechta ilg’or shakllari bor, misollarni ko’raylik:
- Aniq son:
{5}
-
\d{5}
aynan 5 ta raqamni bildiradi,\d\d\d\d\d
bilan bir xil.Quyidagi misol 5 xonali raqamni qidiradi:
alert( "I'm 12345 years old".match(/\d{5}/) ); // "12345"
Uzunroq raqamlarni chiqarib tashlash uchun
\b
qo’shishimiz mumkin:\b\d{5}\b
. - Diapazon:
{3,5}
, 3-5 marta mos keladi -
3 dan 5 gacha raqamlarni topish uchun chegaralarni jingalak qavslarga qo’yishimiz mumkin:
\d{3,5}
alert( "I'm not 12, but 1234 years old".match(/\d{3,5}/) ); // "1234"
Yuqori chegarani tashlab qo’yishimiz mumkin.
Keyin
\d{3,}
regexp uzunligi3
yoki undan ko’p raqamlar ketma-ketligini qidiradi:alert( "I'm not 12, but 345678 years old".match(/\d{3,}/) ); // "345678"
+7(903)-123-45-67
satriga qaytaylik.
Raqam – bu bir yoki undan ko’p raqamlarning ketma-ketligi. Demak, regexp \d{1,}
:
let str = "+7(903)-123-45-67";
let numbers = str.match(/\d{1,}/g);
alert(numbers); // 7,903,123,45,67
Qisqartmalar
Ko’p ishlatiladigan miqdorchilar uchun qisqartmalar mavjud:
+
-
“Bir yoki ko’p” degani,
{1,}
bilan bir xil.Masalan,
\d+
raqamlarni qidiradi:let str = "+7(903)-123-45-67"; alert( str.match(/\d+/g) ); // 7,903,123,45,67
?
-
“Nol yoki bir” degani,
{0,1}
bilan bir xil. Boshqacha qilib aytganda, belgini ixtiyoriy qiladi.Masalan,
ou?r
naqshio
dan keyin nol yoki bittau
, keyinr
ni qidiradi.Shunday qilib,
colou?r
hamcolor
hamcolour
ni topadi:let str = "Should I write color or colour?"; alert( str.match(/colou?r/g) ); // color, colour
*
-
“Nol yoki ko’p” degani,
{0,}
bilan bir xil. Ya’ni belgi istalgan marta takrorlanishi yoki umuman bo’lmasligi mumkin.Masalan,
\d0*
raqamdan keyin istalgan miqdordagi nollarni qidiradi (ko’p yoki hech bo’lmasligi mumkin):alert( "100 10 1".match(/\d0*/g) ); // 100, 10, 1
Uni
+
(bir yoki ko’p) bilan solishtiring:alert( "100 10 1".match(/\d0+/g) ); // 100, 10 // 1 mos kelmadi, chunki 0+ kamida bitta nol talab qiladi
Ko’proq misollar
Miqdorchilar juda tez-tez ishlatiladi. Ular murakkab doimiy ifodalarning asosiy “qurilish bloki” vazifasini bajaradi, shuning uchun ko’proq misollarni ko’raylik.
O’nli kasrlar uchun regexp (suzuvchi nuqtali raqam): \d+\.\d+
Amalda:
alert( "0 1 12.345 7890".match(/\d+\.\d+/g) ); // 12.345
Atributsiz “HTML tegi ochish” uchun regexp, masalan <span>
yoki <p>
.
-
Eng oddiyi:
/<[a-z]+>/i
alert( "<body> ... </body>".match(/<[a-z]+>/gi) ); // <body>
Regexp
'<'
belgisini, keyin bir yoki ko’p lotin harflarini, keyin'>'
ni qidiradi. -
Yaxshilangan:
/<[a-z][a-z0-9]*>/i
Standartga ko’ra, HTML teg nomi birinchisidan tashqari istalgan pozitsiyada raqamga ega bo’lishi mumkin, masalan
<h1>
.alert( "<h1>Hi!</h1>".match(/<[a-z][a-z0-9]*>/gi) ); // <h1>
“Atributsiz HTML tegi ochish yoki yopish” uchun regexp: /<\/?[a-z][a-z0-9]*>/i
Biz naqsh boshiga ixtiyoriy qiyshiq chiziq /?
qo’shdik. Uni teskari chiziq bilan ekranlashga to’g’ri keldi, aks holda JavaScript uni naqsh oxiri deb o’ylaydi.
alert( "<h1>Hi!</h1>".match(/<\/?[a-z][a-z0-9]*>/gi) ); // <h1>, </h1>
Bu misollarda umumiy qoidani ko’rishimiz mumkin: doimiy ifoda qanchalik aniq bo’lsa – shunchalik uzun va murakkab.
Masalan, HTML teglar uchun biz oddiyroq regexpdan foydalanishimiz mumkin: <\w+>
. Lekin HTML teg nomi uchun qattiqroq cheklovlarga ega bo’lgani uchun, <[a-z][a-z0-9]*>
ishonchlirog’.
<\w+>
ishlatamizmi yoki <[a-z][a-z0-9]*>
kerakmi?
Haqiqiy hayotda ikkala variant ham qabul qilinadi. Bu “qo’shimcha” mosliklarga qanchalik toqat qilishimiz va ularni boshqa usullar bilan natijadan olib tashlash qiyin yoki yoqligiga bog’liq.
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…)