Amaliy vazifani ko’rib chiqaylik – bizda "+7(903)-123-45-67"
kabi telefon raqami bor va uni toza raqamlarga aylantirmoqchimiz: 79031234567
.
Buning uchun biz raqam bo’lmagan hamma narsani topib, olib tashlashimiz mumkin. Belgilar sinflari bunga yordam beradi.
Belgilar sinfi – bu ma’lum to’plamdan istalgan belgiga mos keladigan maxsus belgi.
Boshidan, “raqam” sinfini ko’rib chiqaylik. U \d
ko’rinishida yoziladi va "har qanday bitta raqam"ga mos keladi.
Masalan, telefon raqamidagi birinchi raqamni topaylik:
let str = "+7(903)-123-45-67";
let regexp = /\d/;
alert( str.match(regexp) ); // 7
g
bayrog’isiz doimiy ifoda faqat birinchi moslikni qidiradi, ya’ni birinchi raqam \d
.
Barcha raqamlarni topish uchun g
bayrog’ini qo’shaylik:
let str = "+7(903)-123-45-67";
let regexp = /\d/g;
alert( str.match(regexp) ); // mosliklar massivi: 7,9,0,3,1,2,3,4,5,6,7
// ulardan faqat raqamli telefon raqami yasaylik:
alert( str.match(regexp).join('') ); // 79031234567
Bu raqamlar uchun belgilar sinfi edi. Boshqa belgilar sinflari ham mavjud.
Eng ko’p ishlatiladiganlar:
\d
(“d” "digit"dan)- Raqam:
0
dan9
gacha belgi. \s
(“s” "space"dan)- Bo’sh joy belgisi: bo’shliqlar, tablar
\t
, yangi qatorlar\n
va\v
,\f
,\r
kabi kam uchraydigan boshqa belgilarni o’z ichiga oladi. \w
(“w” "word"dan)- “So’z” belgisi: lotin alifbosining harfi yoki raqam yoki pastki chiziq
_
. Lotin bo’lmagan harflar (masalan, kirill yoki hindi)\w
ga tegishli emas.
Masalan, \d\s\w
degani “raqam”, keyin “bo’shliq belgisi”, keyin “so’z belgisi”, masalan 1 a
.
Doimiy ifoda oddiy belgilar va belgilar sinflarini o’z ichiga olishi mumkin.
Masalan, CSS\d
CSS
satriga undan keyin raqam bilan mos keladi:
let str = "Is there CSS4?";
let regexp = /CSS\d/
alert( str.match(regexp) ); // CSS4
Shuningdek, ko’plab belgilar sinflarini ishlatishimiz mumkin:
alert( "I love HTML5!".match(/\s\w\w\w\w\d/) ); // ' HTML5'
Moslik (har bir regexp belgilar sinfi tegishli natija belgisiga ega):
Teskari sinflar
Har bir belgilar sinfi uchun bir xil harf bilan, lekin katta harfda yozilgan “teskari sinf” mavjud.
“Teskari” degani u boshqa barcha belgilarga mos keladi, masalan:
\D
- Raqam emas:
\d
dan tashqari har qanday belgi, masalan harf. \S
- Bo’shliq emas:
\s
dan tashqari har qanday belgi, masalan harf. \W
- So’z belgisi emas:
\w
dan tashqari hamma narsa, masalan lotin bo’lmagan harf yoki bo’shliq.
Bob boshida +7(903)-123-45-67
kabi satrdan faqat raqamli telefon raqami yasashni ko’rdik: barcha raqamlarni topib, ularni birlashtirdik.
let str = "+7(903)-123-45-67";
alert( str.match(/\d/g).join('') ); // 79031234567
Muqobil, qisqaroq yo’l – raqam bo’lmagan \D
belgilarni topib, ularni satrdan olib tashlash:
let str = "+7(903)-123-45-67";
alert( str.replace(/\D/g, "") ); // 79031234567
Nuqta “har qanday belgi”
Nuqta .
– bu "yangi qatordan tashqari har qanday belgi"ga mos keladigan maxsus belgilar sinfi.
Masalan:
alert( "Z".match(/./) ); // Z
Yoki doimiy ifoda o’rtasida:
let regexp = /CS.4/;
alert( "CSS4".match(regexp) ); // CSS4
alert( "CS-4".match(regexp) ); // CS-4
alert( "CS 4".match(regexp) ); // CS 4 (bo'shliq ham belgi)
E’tibor bering, nuqta “har qanday belgi” degani, lekin “belgi yo’qligi” emas. Unga mos kelishi uchun belgi bo’lishi kerak:
alert( "CS4".match(/CS.4/) ); // null, moslik yo'q chunki nuqta uchun belgi yo'q
“s” bayrog’i bilan tom ma’noda har qanday belgi
Sukut bo’yicha, nuqta yangi qator belgisi \n
ga mos kelmaydi.
Masalan, A.B
regexp A
ga, keyin oralarda har qanday belgi bilan B
ga mos keladi, yangi qator \n
bundan mustasno:
alert( "A\nB".match(/A.B/) ); // null (moslik yo'q)
Nuqtaning tom ma’noda “har qanday belgi”, yangi qator ham dahil, degani kerak bo’lgan ko’p holatlar mavjud.
s
bayrog’i aynan shuni qiladi. Agar doimiy ifodada u bo’lsa, nuqta .
tom ma’noda har qanday belgiga mos keladi:
alert( "A\nB".match(/A.B/s) ); // A\nB (moslik!)
s
bayrog’i IE da qo’llab-quvvatlanmaydi.
Yaxshiyamki, hamma joyda ishlaydigan muqobil bor. Biz "har qanday belgi"ga mos kelish uchun [\s\S]
kabi regexp ishlatishimiz mumkin (bu naqsh To'plamlar va diapazonlar [...] maqolasida ko’rib chiqiladi).
alert( "A\nB".match(/A[\s\S]B/) ); // A\nB (moslik!)
[\s\S]
naqshi tom ma’noda: “bo’shliq belgisi YOKI bo’shliq belgisi emas”. Boshqacha qilib aytganda, “hamma narsa”. Biz [\d\D]
kabi boshqa to’ldiruvchi sinflar juftligini ishlatishimiz mumkin, bu muhim emas. Yoki hatto [^]
– chunki bu hech narsadan tashqari har qanday belgiga mos kelish degani.
Shuningdek, bir xil naqshda har ikkala “nuqta” turini xohlasak, bu hiyladan foydalanishimiz mumkin: oddiy yo’l bilan ishlaydigan haqiqiy nuqta .
(“yangi qatorni o’z ichiga olmaydi”) va [\s\S]
yoki shunga o’xshash bilan "har qanday belgi"ga mos kelish usuli.
Odatda biz bo’shliqlarga kam e’tibor beramiz. Biz uchun 1-5
va 1 - 5
satrlar deyarli bir xil.
Lekin agar doimiy ifoda bo’shliqlarni hisobga olmasa, u ishlamay qolishi mumkin.
Defis bilan ajratilgan raqamlarni topishga harakat qilaylik:
alert( "1 - 5".match(/\d-\d/) ); // null, moslik yo'q!
Doimiy ifodaga bo’shliqlar qo’shib \d - \d
tuzataylik:
alert( "1 - 5".match(/\d - \d/) ); // 1 - 5, endi ishlaydi
// yoki \s sinfidan foydalanishimiz mumkin:
alert( "1 - 5".match(/\d\s-\s\d/) ); // 1 - 5, bu ham ishlaydi
Bo’shliq – bu belgi. Boshqa har qanday belgi bilan teng ahamiyatga ega.
Biz doimiy ifodadan bo’shliqlarni qo’sha yoki olib tashlay olmaymiz va uning bir xil ishlashini kutolmaymiz.
Boshqacha qilib aytganda, doimiy ifodada barcha belgilar muhim, bo’shliqlar ham.
Xulosa
Quyidagi belgilar sinflari mavjud:
\d
– raqamlar.\D
– raqam emas.\s
– bo’shliq belgilari, tablar, yangi qatorlar.\S
–\s
dan tashqari hammasi.\w
– lotin harflari, raqamlar, pastki chiziq'_'
.\W
–\w
dan tashqari hammasi..
– regexp's'
bayrog’i bilan har qanday belgi, aks holda yangi qator\n
dan tashqari hamma.
…Lekin bu hammasi emas!
JavaScript satrlar uchun ishlatiladigan Unicode kodlash belgilar uchun ko’plab xususiyatlarni taqdim etadi, masalan: harf qaysi tilga tegishli (agar harf bo’lsa), tinish belgisimi va hokazo.
Biz bu xususiyatlar bo’yicha ham qidirishimiz mumkin. Bu u
bayrog’ini talab qiladi, keyingi maqolada ko’rib chiqiladi.
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…)