Ushbu maqolada biz regexplar bilan ishlaydigan turli usullarni chuqur koârib chiqamiz.
str.match(regexp)
str.match(regexp) usuli str satrida regexp uchun mosliklarni topadi.
Uning 3 ta rejimi bor:
-
Agar
regexpdagbayrogâi boâlmasa, u birinchi moslikni tutuvchi guruhlar vaindex(moslik pozitsiyasi),input(kirish satri,strga teng) xususiyatlari bilan massiv sifatida qaytaradi:let str = "Men JavaScriptni yaxshi ko'raman"; let result = str.match(/Java(Script)/); alert( result[0] ); // JavaScript (to'liq moslik) alert( result[1] ); // Script (birinchi tutuvchi guruh) alert( result.length ); // 2 // Qo'shimcha ma'lumot: alert( result.index ); // 4 (moslik pozitsiyasi) alert( result.input ); // Men JavaScriptni yaxshi ko'raman (manba satr) -
Agar
regexpdagbayrogâi boâlsa, u barcha mosliklarni tutuvchi guruhlar va boshqa tafsilotlarsiz satrlar sifatida massiv qaytaradi.let str = "Men JavaScriptni yaxshi ko'raman"; let result = str.match(/Java(Script)/g); alert( result[0] ); // JavaScript alert( result.length ); // 1 -
Agar mosliklar boâlmasa,
gbayrogâi bor yoki yoâqligidan qatâi nazar,nullqaytariladi.Bu muhim nüans. Agar mosliklar boâlmasa, biz boâsh massiv emas, balki
nullolamiz. Buni unutish va xato qilish oson, masalan:let str = "Men JavaScriptni yaxshi ko'raman"; let result = str.match(/HTML/); alert(result); // null alert(result.length); // Xato: Cannot read property 'length' of nullAgar natija massiv boâlishini istasak, quyidagicha yozishimiz mumkin:
let result = str.match(regexp) || [];
str.matchAll(regexp)
str.matchAll(regexp) usuli str.match ning âyangilangan, yaxshilanganâ variantidir.
U asosan barcha guruhlar bilan barcha mosliklarni qidirish uchun ishlatiladi.
match dan 3 ta farqi bor:
- U massiv oârniga mosliklar bilan takrorlanadigan obyekt qaytaradi. Biz undan
Array.fromyordamida oddiy massiv yasashimiz mumkin. - Har bir moslik tutuvchi guruhlar bilan massiv sifatida qaytariladi (
gbayrogâisizstr.matchbilan bir xil format). - Agar natijalar boâlmasa, u
nulloârniga boâsh takrorlanadigan obyekt qaytaradi.
Foydalanish misoli:
let str = '<h1>Salom, dunyo!</h1>';
let regexp = /<(.*?)>/g;
let matchAll = str.matchAll(regexp);
alert(matchAll); // [object RegExp String Iterator], massiv emas, lekin takrorlanadigan
matchAll = Array.from(matchAll); // endi massiv
let firstMatch = matchAll[0];
alert( firstMatch[0] ); // <h1>
alert( firstMatch[1] ); // h1
alert( firstMatch.index ); // 0
alert( firstMatch.input ); // <h1>Salom, dunyo!</h1>
Agar biz matchAll mosliklarini aylanib chiqish uchun for..of dan foydalansak, endi Array.from kerak emas.
str.split(regexp|substr, limit)
Satrni regexp (yoki pastki satr) ni ajratuvchi sifatida ishlatib boâladi.
Biz split ni satrlar bilan ishlatishimiz mumkin, masalan:
alert('12-34-56'.split('-')) // ['12', '34', '56'] massivi
Ammo biz muntazam ifoda bilan ham xuddi shunday boâlishimiz mumkin:
alert('12, 34, 56'.split(/,\s*/)) // ['12', '34', '56'] massivi
str.search(regexp)
str.search(regexp) usuli birinchi moslikning pozitsiyasini yoki topilmasa -1 ni qaytaradi:
let str = "Siyoh tomchisi millionlarni o'ylantirishi mumkin";
alert( str.search( /siyoh/i ) ); // 0 (birinchi moslik pozitsiyasi)
Muhim cheklov: search faqat birinchi moslikni topadi.
Agar bizga keyingi mosliklar pozitsiyalari kerak boâlsa, str.matchAll(regexp) bilan barchasini topish kabi boshqa vositalardan foydalanishimiz kerak.
str.replace(str|regexp, str|func)
Bu qidirish va almashtirish uchun umumiy usul, eng foydalilaridan biri. Qidirish va almashtirish uchun universal vosita.
Biz uni regexplarsiz, pastki satrni qidirish va almashtirish uchun ishlatishimiz mumkin:
// defisni ikki nuqta bilan almashtirish
alert('12-34-56'.replace("-", ":")) // 12:34-56
Biroq, tuzoq bor.
replace ning birinchi argumenti satr boâlsa, u faqat birinchi moslikni almashtiradi.
Buni yuqoridagi misolda koârishingiz mumkin: faqat birinchi "-" ":" bilan almashtiriladi.
Barcha defislarni topish uchun biz "-" satrini emas, balki majburiy g bayrogâi bilan /-/g regexp dan foydalanishimiz kerak:
// barcha defislarni ikki nuqta bilan almashtirish
alert( '12-34-56'.replace( /-/g, ":" ) ) // 12:34:56
Ikkinchi argument almashtirish satridir. Biz unda maxsus belgilardan foydalanishimiz mumkin:
| Belgilar | Almashtirish satridagi harakat |
|---|---|
$& |
butun moslikni qoâyadi |
$` |
moslikdan oldingi satr qismini qoâyadi |
$' |
moslikdan keyingi satr qismini qoâyadi |
$n |
agar n 1-2 xonali raqam boâlsa, n-chi tutuvchi guruh tarkibini qoâyadi, tafsilotlar uchun Ushlash guruhlari ga qarang |
$<name> |
berilgan name ga ega qavslar tarkibini qoâyadi, tafsilotlar uchun Ushlash guruhlari ga qarang |
$$ |
$ belgisini qoâyadi |
Masalan:
let str = "John Smith";
// ism va familiyani almashtirish
alert(str.replace(/(john) (smith)/i, '$2, $1')) // Smith, John
âAqlliâ almashtirishlar talab qiladigan holatlar uchun ikkinchi argument funksiya boâlishi mumkin.
U har bir moslik uchun chaqiriladi va qaytarilgan qiymat almashtirish sifatida qoâyiladi.
Funksiya func(match, p1, p2, ..., pn, offset, input, groups) argumentlari bilan chaqiriladi:
matchâ moslik,p1, p2, ..., pnâ tutuvchi guruhlar tarkibi (agar mavjud boâlsa),offsetâ moslik pozitsiyasi,inputâ manba satr,groupsâ nomlangan guruhlar bilan obyekt.
Agar regexpda qavslar boâlmasa, faqat 3 ta argument bor: func(str, offset, input).
Masalan, barcha mosliklarni katta harflarga oâtkazaylik:
let str = "html va css";
let result = str.replace(/html|css/gi, str => str.toUpperCase());
alert(result); // HTML va CSS
Har bir moslikni satrdagi pozitsiyasi bilan almashtirish:
alert("Ho-Ho-ho".replace(/ho/gi, (match, offset) => offset)); // 0-3-6
Quyidagi misolda ikkita qavs bor, shuning uchun almashtirish funksiyasi 5 ta argument bilan chaqiriladi: birinchisi toâliq moslik, keyin 2 ta qavs, va undan keyin (misolda ishlatilmagan) moslik pozitsiyasi va manba satr:
let str = "John Smith";
let result = str.replace(/(\w+) (\w+)/, (match, name, surname) => `${surname}, ${name}`);
alert(result); // Smith, John
Agar koâp guruhlar boâlsa, ularga kirish uchun qolgan parametrlardan foydalanish qulay:
let str = "John Smith";
let result = str.replace(/(\w+) (\w+)/, (...match) => `${match[2]}, ${match[1]}`);
alert(result); // Smith, John
Yoki agar biz nomlangan guruhlardan foydalansak, groups obyekti ular bilan har doim oxirgi boâladi, shuning uchun uni quyidagicha olishimiz mumkin:
let str = "John Smith";
let result = str.replace(/(?<name>\w+) (?<surname>\w+)/, (...match) => {
let groups = match.pop();
return `${groups.surname}, ${groups.name}`;
});
alert(result); // Smith, John
Funksiyadan foydalanish bizga yakuniy almashtirish kuchini beradi, chunki u moslik haqida barcha maâlumotlarni oladi, tashqi oâzgaruvchilarga kirish imkoniga ega va hamma narsani qila oladi.
str.replaceAll(str|regexp, str|func)
Bu usul asosan str.replace bilan bir xil, ikkita katta farq bilan:
- Agar birinchi argument satr boâlsa, u satrning barcha takrorlanishlarini almashtiradi,
replaceesa faqat birinchi takrorlanishni almashtiradi. - Agar birinchi argument
gbayrogâisiz muntazam ifoda boâlsa, xatolik boâladi.gbayrogâi bilan ureplacekabi ishlaydi.
replaceAll ning asosiy foydalanish holati satrning barcha takrorlanishlarini almashtirish.
Masalan:
// barcha defislarni ikki nuqta bilan almashtirish
alert('12-34-56'.replaceAll("-", ":")) // 12:34:56
regexp.exec(str)
regexp.exec(str) usuli str satrida regexp uchun moslik qaytaradi. Oldingi usullardan farqli oâlaroq, u satrda emas, balki regexpda chaqiriladi.
U regexpda g bayrogâi bor-yoâqligiga qarab turlicha harakat qiladi.
Agar g boâlmasa, regexp.exec(str) birinchi moslikni aniq str.match(regexp) kabi qaytaradi. Bu xatti-harakat yangi hech narsa keltirmaydi.
Ammo agar g bayrogâi boâlsa:
regexp.exec(str)ga chaqiruv birinchi moslikni qaytaradi va undan keyin pozitsiyaniregexp.lastIndexxususiyatida saqlaydi.- Keyingi bunday chaqiruv qidiruvni
regexp.lastIndexpozitsiyasidan boshlaydi, keyingi moslikni qaytaradi va undan keyingi pozitsiyaniregexp.lastIndexda saqlaydi. - â¦Va hokazo.
- Agar mosliklar boâlmasa,
regexp.execnullqaytaradi varegexp.lastIndexni0ga qayta oârnatadi.
Shunday qilib, takroriy chaqiruvlar joriy qidiruv pozitsiyasini kuzatib borish uchun regexp.lastIndex xususiyatidan foydalanib, barcha mosliklarni birin-ketin qaytaradi.
Oâtmishda, str.matchAll usuli JavaScript ga qoâshilgunga qadar, regexp.exec chaqiruvlari guruhlar bilan barcha mosliklarni olish uchun tsiklda ishlatilgan:
let str = 'JavaScript haqida batafsil https://javascript.info da';
let regexp = /javascript/ig;
let result;
while (result = regexp.exec(str)) {
alert( `${result[0]} ni ${result.index} pozitsiyasida topdi` );
// JavaScript ni 0 pozitsiyasida topdi, keyin
// javascript ni 32 pozitsiyasida topdi
}
Bu hozir ham ishlaydi, garchi yangi brauzerlar uchun str.matchAll odatda qulayroq.
Biz lastIndex ni qoâlda oârnatish orqali berilgan pozitsiyadan qidirish uchun regexp.exec dan foydalanishimiz mumkin.
Masalan:
let str = 'Salom, dunyo!';
let regexp = /\w+/g; // "g" bayrog'isiz lastIndex xususiyati e'tiborga olinmaydi
regexp.lastIndex = 5; // 5-pozitsiyadan qidirish (verguldan)
alert( regexp.exec(str) ); // dunyo
Agar regexpda y bayrogâi boâlsa, qidiruv aniq regexp.lastIndex pozitsiyasida amalga oshiriladi, undan uzoqroq emas.
Yuqoridagi misolda g bayrogâini y bilan almashtiraylik. Mosliklar boâlmaydi, chunki 5-pozitsiyada soâz yoâq:
let str = 'Salom, dunyo!';
let regexp = /\w+/y;
regexp.lastIndex = 5; // aniq 5-pozitsiyada qidirish
alert( regexp.exec(str) ); // null
Bu biz satrdan aniq pozitsiyada regexp bilan biror narsani âoâqishimizâ kerak boâlgan holatlar uchun qulay, uzoqroq joyda emas.
regexp.test(str)
regexp.test(str) usuli moslik qidiradi va u mavjudligiga qarab true/false qaytaradi.
Masalan:
let str = "Men JavaScriptni yaxshi ko'raman";
// bu ikki test bir xil
alert( /yaxshi/i.test(str) ); // true
alert( str.search(/yaxshi/i) != -1 ); // true
Salbiy javob bilan misol:
let str = "Bla-bla-bla";
alert( /yaxshi/i.test(str) ); // false
alert( str.search(/yaxshi/i) != -1 ); // false
Agar regexpda g bayrogâi boâlsa, regexp.test regexp.lastIndex xususiyatidan qaraydi va bu xususiyatni yangilaydi, xuddi regexp.exec kabi.
Shuning uchun biz uni berilgan pozitsiyadan qidirish uchun ishlatishimiz mumkin:
let regexp = /yaxshi/gi;
let str = "Men JavaScriptni yaxshi ko'raman";
// 10-pozitsiyadan qidiruvni boshlash:
regexp.lastIndex = 10;
alert( regexp.test(str) ); // false (moslik yo'q)
Agar biz bir xil global regexpni turli kirishlarga qoâllasak, bu notoâgâri natijaga olib kelishi mumkin, chunki regexp.test chaqiruvi regexp.lastIndex xususiyatini oldinga siljitadi, shuning uchun boshqa satrdagi qidiruv noldan boshqa pozitsiyadan boshlana oladi.
Masalan, bu yerda biz bir xil matnda regexp.test ni ikki marta chaqiramiz va ikkinchi marta muvaffaqiyatsiz boâladi:
let regexp = /javascript/g; // (regexp hozirgina yaratildi: regexp.lastIndex=0)
alert( regexp.test("javascript") ); // true (regexp.lastIndex=10 endi)
alert( regexp.test("javascript") ); // false
Bu aniq regexp.lastIndex ikkinchi testda noldan farq qilgani uchun.
Buni hal qilish uchun har bir qidiruvdan oldin regexp.lastIndex = 0 oârnatishimiz mumkin. Yoki regexp usullarini chaqirish oârniga lastIndex dan foydalanmaydigan str.match/search/... satr usullaridan foydalaning.
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â¦)