Doimiy ifodalar – bu matnni izlash va almashtirishning kuchli usuli.
JavaScript-da doimiy ifodalar o’rnatilgan RegExp
klassidagi obyektlar yordamida amalga oshiriladi va satrlar bilan birlashtirilgan.
E’tibor bering, doimiy ifodalar dasturlash tillarida turlicha bo’lishi mumkin. Ushbu qo’llanmada biz JavaScript-ni ko’rib chiqamiz. Albatta, umumiy jihatlar juda ko’p, ammo ular Perl, Ruby, PHP va boshqalarda bir-biridan farq qiladi.
Doimiy ifodalar
Doimiy ifoda (shuningdek, “regexp” yoki shunchaki “reg”) naqsh va ixtiyoriy bayroqlardan iborat.
Doimiy ifoda obyektini yaratish uchun ikkita sintaksis mavjud.
Uzun sintaksis:
regexp = new RegExp("pattern", "flags");
…Va "/"
chiziqlaridan foydalangan holda qisqa:
regexp = /pattern/; // bayroqlar yo'q
regexp = /pattern/gmi; // g, m va i bayroqlari bilan (tez orada ko'rib chiqamiz)
Qiyshiq chiziqlar "/"
JavaScript-ga biz doimiy ifoda yaratayotganimizni bildiradi. Ular matnlar uchun qo’shtirnoqlar bilan bir xil rol o’ynaydi.
Foydalanish
Bu ikki sintaksis o’rtasidagi asosiy farq shundaki, qiyshiq chiziqlar /.../
yordamida naqsh ifodalarni kiritishga imkon bermaydi (masalan, ${...}
bilan satr shablon literallari kabi). Ular butunlay statik.
Qiyshiq chiziqlar kod yozish vaqtida doimiy ifodani bilganimizda ishlatiladi – va bu eng keng tarqalgan holat. new RegExp
esa ko’proq dinamik ravishda yaratilgan satrdan “on the fly” doimiy ifoda yaratishimiz kerak bo’lganda ishlatiladi. Masalan:
let tag = prompt("Qaysi tegni topishni xohlaysiz?", "h2");
let regexp = new RegExp(`<${tag}>`); // yuqoridagi promptda "h2" javob berilgan bo'lsa /<h2>/ bilan bir xil
Bayroqlar
Doimiy ifodalarda qidiruvga ta’sir qiluvchi bayroqlar bo’lishi mumkin.
JavaScript-da faqat 6 tasi mavjud:
i
- Bu bayroq bilan qidiruv katta-kichik harflarga sezgir emas:
A
vaa
o’rtasida farq yo’q (quyidagi misolga qarang). g
- Bu bayroq bilan qidiruv barcha mosliklarni qidiradi, u bo’lmasa – faqat birinchi moslik qaytariladi.
m
- Ko’p qatorli rejim (Langarlarning ko'p qatorli rejimi ^ $, "m" bayrog'i bobida ko’rib chiqiladi).
s
- “Dotall” rejimini yoqadi, bu nuqta
.
ga yangi qator belgisi\n
ga mos kelish imkonini beradi (Belgilar sinflari bobida ko’rib chiqiladi). u
- To’liq Unicode qo’llab-quvvatlashni yoqadi. Bayroq surrogate juftlarni to’g’ri qayta ishlashga imkon beradi. Bu haqda ko’proq Unicode: "u" bayrog'i va \p{...} sinfi bobida.
y
- “Yopishqoq” rejim: matnda aniq pozitsiyada qidirish (Yopishqoq bayroq "y", pozitsiyada qidirish bobida ko’rib chiqiladi)
Bu yerdan boshlab rang sxemasi:
- doimiy ifoda –
qizil
- satr (biz qidirgan joy) –
ko'k
- natija –
yashil
Qidiruv: str.match
Yuqorida aytib o’tilganidek, doimiy ifodalar satr metodlari bilan birlashtirilgan.
str.match(regexp)
metodi str
satrida regexp
ning barcha mosliklarini topadi.
Uning 3 ta ish rejimi bor:
-
Agar doimiy ifodada
g
bayrog’i bo’lsa, u barcha mosliklarning massivini qaytaradi:let str = "We will, we will rock you"; alert( str.match(/we/gi) ); // We,we (2 ta mos keluvchi pastki satrlar massivi)
E’tibor bering,
We
ham,we
ham topildi, chunkii
bayrog’i doimiy ifodani katta-kichik harflarga sezgir emas qiladi. -
Agar bunday bayroq bo’lmasa, u faqat birinchi moslikni massiv ko’rinishida qaytaradi, to’liq moslik
0
indeksida va ba’zi qo’shimcha tafsilotlar xususiyatlarda:let str = "We will, we will rock you"; let result = str.match(/we/i); // g bayrog'isiz alert( result[0] ); // We (1-moslik) alert( result.length ); // 1 // Tafsilotlar: alert( result.index ); // 0 (moslik pozitsiyasi) alert( result.input ); // We will, we will rock you (manba satr)
Massivda
0
dan tashqari boshqa indekslar ham bo’lishi mumkin, agar doimiy ifodaning bir qismi qavslar ichiga olingan bo’lsa. Buni Ushlash guruhlari bobida ko’rib chiqamiz. -
Va nihoyat, agar moslik bo’lmasa,
null
qaytariladi (g
bayrog’i bor-yo’qligi muhim emas).Bu juda muhim noyanslik. Agar moslik bo’lmasa, biz bo’sh massiv emas, balki
null
olamiz. Buni unutish xatolarga olib kelishi mumkin, masalan:let matches = "JavaScript".match(/HTML/); // = null if (!matches.length) { // Xato: Cannot read property 'length' of null alert("Yuqoridagi qatorda xato"); }
Agar natija har doim massiv bo’lishini xohlasak, uni shunday yozishimiz mumkin:
let matches = "JavaScript".match(/HTML/) || []; if (!matches.length) { alert("Moslik yo'q"); // endi ishlaydi }
Almashtirish: str.replace
str.replace(regexp, replacement)
metodi str
satrida regexp
yordamida topilgan mosliklarni replacement
bilan almashtiradi (g
bayrog’i bo’lsa barcha mosliklarni, aks holda faqat birinchisini).
Masalan:
// g bayrog'isiz
alert( "We will, we will".replace(/we/i, "I") ); // I will, we will
// g bayrog'i bilan
alert( "We will, we will".replace(/we/ig, "I") ); // I will, I will
Ikkinchi argument replacement
satridir. Biz unda moslik fragmentlarini kiritish uchun maxsus belgilar kombinatsiyasidan foydalanishimiz mumkin:
Belgilar | Almashtirish satrida harakat |
---|---|
$& |
butun moslikni kiritadi |
$` |
moslikdan oldingi satr qismini kiritadi |
$' |
moslikdan keyingi satr qismini kiritadi |
$n |
agar n 1-2 raqamli son bo’lsa, n-chi qavs mazmunini kiritadi, bu haqda ko’proq Ushlash guruhlari bobida |
$<name> |
berilgan name bilan qavslar mazmunini kiritadi, bu haqda ko’proq Ushlash guruhlari bobida |
$$ |
$ belgisini kiritadi |
$&
bilan misol:
alert( "I love HTML".replace(/HTML/, "$& and JavaScript") ); // I love HTML and JavaScript
Sinash: regexp.test
regexp.test(str)
metodi kamida bitta moslikni qidiradi, agar topilsa true
, aks holda false
qaytaradi.
let str = "I love JavaScript";
let regexp = /LOVE/i;
alert( regexp.test(str) ); // true
Ushbu bobning davomida biz ko’proq doimiy ifodalarni o’rganamiz, ko’proq misollar bilan tanishamiz va boshqa metodlar bilan ham uchrashamiz.
Metodlar haqida to’liq ma’lumot RegExp va String usullari maqolasida berilgan.
Xulosa
- Doimiy ifoda naqsh va ixtiyoriy bayroqlardan iborat:
g
,i
,m
,u
,s
,y
. - Bayroqlar va maxsus belgilarsiz (keyinroq o’rganamiz), regexp bo’yicha qidiruv pastki satr qidiruvi bilan bir xil.
str.match(regexp)
metodi mosliklarni qidiradi:g
bayrog’i bo’lsa barchasini, aks holda faqat birinchisini.str.replace(regexp, replacement)
metodiregexp
yordamida topilgan mosliklarnireplacement
bilan almashtiradi:g
bayrog’i bo’lsa barchasini, aks holda faqat birinchisini.regexp.test(str)
metodi kamida bitta moslik bo’lsatrue
, aks holdafalse
qaytaradi.
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…)