9-bo‘lim

Satrlar bilan ishlash

Satr metodlari, qidirish va almashtirish, bo'lish va birlashtirish, shablon satrlari, Unicode va muntazam ifodalar bilan tanishuv.

🕑 17 daqiqa o‘qish 📄 659 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Asosiy xossalar
  2. Qidirish
  3. Kesib olish
  4. Almashtirish
  5. Bo'lish va birlashtirish
  6. To'ldirish va takrorlash
  7. Shablon satrlari
  8. Unicode va uzunlik
  9. Taqqoslash va saralash
  10. Muntazam ifodalar bilan tanishuv
  11. Amaliy misol: matn tahlili
  12. Xulosa

Foydalanuvchi kiritadigan har bir ma'lumot - satr. Ular bilan ishlashni bilish har kunlik ehtiyoj.

Asosiy xossalar #

JavaScript
const matn = "Assalomu alaykum";

console.log("Uzunligi   :", matn.length);
console.log("Birinchi   :", matn[0]);
console.log("Oxirgi     :", matn.at(-1));
console.log("Katta harf :", matn.toUpperCase());
console.log("Kichik harf:", matn.toLowerCase());
console.log("Asl matn   :", matn);
Natija
Uzunligi   : 16
Birinchi   : A
Oxirgi     : m
Katta harf : ASSALOMU ALAYKUM
Kichik harf: assalomu alaykum
Asl matn   : Assalomu alaykum
Satrlar o'zgarmas (immutable)
JavaScript
const matn = "salom";
matn[0] = "S";
console.log(matn);          // "salom" - o'zgarmadi

Satr elementini o'zgartirib bo'lmaydi. Har bir metod yangi satr qaytaradi, aslini o'zgartirmaydi.

Shuning uchun natijani albatta o'zlashtiring:

JavaScript
let matn = "salom";
matn.toUpperCase();          // natija tashlab yuborildi
console.log(matn);           // "salom"

matn = matn.toUpperCase();   // to'g'ri
console.log(matn);           // "SALOM"

Bu massivdan farqi: royxat.push() aslini o'zgartiradi, satr metodlari esa hech qachon.

Qidirish #

JavaScript
const jumla = "JavaScript - veb dasturlash tili";

console.log("includes   :", jumla.includes("veb"));
console.log("startsWith :", jumla.startsWith("Java"));
console.log("endsWith   :", jumla.endsWith("tili"));
console.log("indexOf    :", jumla.indexOf("veb"));
console.log("indexOf yo'q:", jumla.indexOf("Python"));
console.log("lastIndexOf:", jumla.lastIndexOf("a"));
console.log("search     :", jumla.search(/dastur/));
Natija
includes   : true
startsWith : true
endsWith   : true
indexOf    : 13
indexOf yo'q: -1
lastIndexOf: 24
search     : 17

Kesib olish #

JavaScript
const matn = "JavaScript";

console.log("slice(0, 4)   :", matn.slice(0, 4));
console.log("slice(4)      :", matn.slice(4));
console.log("slice(-6)     :", matn.slice(-6));
console.log("slice(-6, -3) :", matn.slice(-6, -3));
console.log("substring(0,4):", matn.substring(0, 4));
console.log("substring teskari:", matn.substring(4, 0));
console.log("slice teskari :", matn.slice(4, 0));
Natija
slice(0, 4)   : Java
slice(4)      : Script
slice(-6)     : Script
slice(-6, -3) : Scr
substring(0,4): Java
substring teskari: Java
slice teskari : 
slice va substring farqi
slicesubstring
Manfiy indeksOxiridan sanaydi0 deb qabul qiladi
Argumentlar teskariBo'sh satrAlmashtiradi

substring(4, 0) argumentlarni jimgina almashtirib substring(0, 4) ga aylantiradi - bu xatoni yashiradi.

slice ni ishlating - u massivdagi slice bilan bir xil ishlaydi va manfiy indeksni qo'llab-quvvatlaydi.

Eskirgan substr metodi ham bor (uzunlik oladi, oxirgi indeks emas) - uni ishlatmang, u standartdan chiqarilgan.

Almashtirish #

JavaScript
const matn = "olma, olma, anor";

console.log("replace    :", matn.replace("olma", "uzum"));
console.log("replaceAll :", matn.replaceAll("olma", "uzum"));
console.log("regex bilan:", matn.replace(/olma/g, "uzum"));
console.log("Asl saqlandi:", matn);

// Bo'shliqlarni tozalash
const kirim = "   Husanboy   ";
console.log("trim      : [" + kirim.trim() + "]");
console.log("trimStart : [" + kirim.trimStart() + "]");
console.log("trimEnd   : [" + kirim.trimEnd() + "]");
Natija
replace    : uzum, olma, anor
replaceAll : uzum, uzum, anor
regex bilan: uzum, uzum, anor
Asl saqlandi: olma, olma, anor
trim      : [Husanboy]
trimStart : [Husanboy   ]
trimEnd   : [   Husanboy]
replace faqat birinchisini almashtiradi

Bu eng ko'p uchraydigan satr xatosi:

JavaScript
"a-b-c".replace("-", "+")       // "a+b-c"  - faqat birinchisi

Hammasini almashtirish uchun:

JavaScript
"a-b-c".replaceAll("-", "+")    // "a+b+c"  - ES2021
"a-b-c".replace(/-/g, "+")      // "a+b+c"  - eski usul

g bayrog'i "global" - hamma mosliklarni topadi.

Diqqat: replaceAll ga g bayroqsiz regex bersangiz xato beradi:

JavaScript
"a-b".replaceAll(/-/, "+")      // TypeError

Bo'lish va birlashtirish #

JavaScript
const csv = "Husanboy,25,Namangan";
const qismlar = csv.split(",");

console.log("split      :", qismlar);
console.log("Ism        :", qismlar[0]);
console.log("Harflarga  :", "abc".split(""));
console.log("Bo'shliq   :", "bir ikki uch".split(" "));
console.log("Chegara    :", "a,b,c,d".split(",", 2));
console.log("join       :", qismlar.join(" | "));

// Ko'p qatorli matnni qatorlarga
const kop = "birinchi\nikkinchi\nuchinchi";
console.log("Qatorlar   :", kop.split("\n").length, "ta");
Natija
split      : [ 'Husanboy', '25', 'Namangan' ]
Ism        : Husanboy
Harflarga  : [ 'a', 'b', 'c' ]
Bo'shliq   : [ 'bir', 'ikki', 'uch' ]
Chegara    : [ 'a', 'b' ]
join       : Husanboy | 25 | Namangan
Qatorlar   : 3 ta

To'ldirish va takrorlash #

JavaScript
console.log("padStart:", "7".padStart(3, "0"));
console.log("padEnd  :", "Ism".padEnd(10, ".") + "qiymat");
console.log("repeat  :", "-".repeat(20));

// Jadval chizish
const qatorlar = [
    ["Mahsulot", "Narx"],
    ["Non", "5000"],
    ["Sut", "12000"]
];

for (const [nom, narx] of qatorlar) {
    console.log(nom.padEnd(12) + narx.padStart(8));
}

// Vaqtni formatlash
const soat = 9;
const daqiqa = 5;
console.log(`${String(soat).padStart(2, "0")}:${String(daqiqa).padStart(2, "0")}`);
Natija
padStart: 007
padEnd  : Ism.......qiymat
repeat  : --------------------
Mahsulot        Narx
Non             5000
Sut            12000
09:05

Shablon satrlari #

JavaScript
const ism = "Malika";
const yosh = 22;

// Ifoda ham yozish mumkin
console.log(`${ism}, ${yosh} yosh, ${yosh >= 18 ? "voyaga yetgan" : "yosh"}`);
console.log(`Kelasi yil: ${yosh + 1}`);

// Ko'p qatorli
const xat = `Hurmatli ${ism},

Sizning arizangiz qabul qilindi.
Rahmat!`;

console.log(xat);

// Ichma-ich shablon
const mahsulotlar = ["olma", "anor"];
console.log(`Ro'yxat: ${mahsulotlar.map((m) => `[${m}]`).join(" ")}`);
Natija
Malika, 22 yosh, voyaga yetgan
Kelasi yil: 23
Hurmatli Malika,

Sizning arizangiz qabul qilindi.
Rahmat!
Ro'yxat: [olma] [anor]
Satr yig'ishning uch usuli + bilan ulash "Salom, " + ism + "! Yosh: " + yosh Uzun va xatoga moyil Bo'shliqni unutish oson concat() "Salom".concat(ism) Kamdan-kam ishlatiladi + dan afzalligi yo'q Shablon satri `Salom, ${ism}!` O'qilishi oson Ko'p qatorli, ifodali Shuni ishlating
Shablon satrlari 2015-yildan beri standart usul

Unicode va uzunlik #

JavaScript
const oddiy = "salom";
const emoji = "salom 👋";
const uzbekcha = "o'zbek tili";

console.log("Oddiy uzunlik :", oddiy.length);
console.log("Emoji uzunlik :", emoji.length);
console.log("Emoji belgilar:", [...emoji].length);
console.log("O'zbekcha     :", uzbekcha.length);

// Emoji ni bo'lish xavfli - yarim belgi qoladi
const buzilgan = emoji.slice(0, 7);
const toliqEmoji = [...emoji].at(-1);

console.log("Buzilgan uzunlik:", buzilgan.length, "birlik");
console.log("Emoji butunmi?  :", buzilgan.endsWith(toliqEmoji));
console.log("To'g'ri kesish  :", [...emoji].slice(0, 7).join(""));
Natija
Oddiy uzunlik : 5
Emoji uzunlik : 8
Emoji belgilar: 7
O'zbekcha     : 11
Buzilgan uzunlik: 7 birlik
Emoji butunmi?  : false
To'g'ri kesish  : salom 👋
length belgilar sonini bermaydi

JavaScript satrlari UTF-16 kod birliklari ketma-ketligi. Ko'pchilik belgi bitta birlik egallaydi, lekin emoji va ba'zi belgilar ikkitasini oladi.

JavaScript
"👋".length          // 2  - bitta belgi, ikkita birlik

Natijada:

  • length noto'g'ri belgi sonini beradi;
  • slice emoji ni o'rtasidan kesib buzishi mumkin;
  • [0] yarim belgini qaytaradi.

Belgilar bo'yicha ishlash uchun satrni massivga aylantiring:

JavaScript
[...matn]                    // to'g'ri bo'linadi
Array.from(matn)             // xuddi shunday

Yanada murakkab holatlar bor - masalan bayroq emojilari va oila emojilari bir necha belgidan iborat. Ular uchun Intl.Segmenter ishlatiladi:

JavaScript
const bolgich = new Intl.Segmenter("uz", { granularity: "grapheme" });
[...bolgich.segment(matn)].length

Amaliy maslahat: foydalanuvchi kiritgan matn uzunligini cheklaganda [...matn].length ishlating - aks holda emoji yozgan foydalanuvchi ikki barobar kam belgi yoza oladi.

Taqqoslash va saralash #

JavaScript
const a = "olma";
const b = "Olma";

console.log("=== bilan     :", a === b);
console.log("Kichik harfda :", a.toLowerCase() === b.toLowerCase());
console.log("localeCompare :", a.localeCompare(b, "uz", { sensitivity: "base" }) === 0);

const shaharlar = ["Toshkent", "andijon", "Namangan"];
console.log("Oddiy sort   :", [...shaharlar].sort());
console.log("localeCompare:", [...shaharlar].sort((x, y) =>
    x.localeCompare(y, "uz", { sensitivity: "base" })));
Natija
=== bilan     : false
Kichik harfda : true
localeCompare : true
Oddiy sort   : [ 'Namangan', 'Toshkent', 'andijon' ]
localeCompare: [ 'andijon', 'Namangan', 'Toshkent' ]

Muntazam ifodalar bilan tanishuv #

JavaScript
const matn = "Telefon: +998 90 123 45 67, email: [email protected]";

// Raqamlarni topish
console.log("Raqamlar:", matn.match(/\d+/g));

// Email topish
const email = matn.match(/[\w.]+@[\w.]+\.\w+/);
console.log("Email   :", email[0]);

// Tekshirish
const parol = "Kuchli123";
console.log("8+ belgi    :", /.{8,}/.test(parol));
console.log("Raqam bor   :", /\d/.test(parol));
console.log("Katta harf  :", /[A-Z]/.test(parol));

// Tozalash
console.log("Faqat raqam :", "+998 (90) 123-45-67".replace(/\D/g, ""));
Natija
Raqamlar: [ '998', '90', '123', '45', '67' ]
Email   : [email protected]
8+ belgi    : true
Raqam bor   : true
Katta harf  : true
Faqat raqam : 998901234567
Eng kerakli regex belgilari
BelgiMa'nosi
\dRaqam (0-9)
\DRaqam emas
\wHarf, raqam yoki _
\sBo'shliq, tab, yangi qator
.Istalgan belgi
+Bir yoki ko'p marta
*Nol yoki ko'p marta
?Nol yoki bir marta
{3}Aynan 3 marta
{2,5}2 dan 5 gacha
^Satr boshi
$Satr oxiri
[abc]a, b yoki c
[^abc]a, b, c dan boshqa
(...)Guruh
``Yoki

Bayroqlar: g (hammasi), i (registrsiz), m (ko'p qatorli).

Ogohlantirish: emailni to'liq tekshiradigan regex juda murakkab va amalda foydasiz. Formada type="email" ishlating va haqiqiy tekshiruvni tasdiqlash xati orqali qiling.

Amaliy misol: matn tahlili #

JavaScript
const maqola = `JavaScript veb dasturlash tili. JavaScript brauzerda
ishlaydi. Node.js yordamida JavaScript serverda ham ishlaydi.`;

const sozlar = maqola
    .toLowerCase()
    .replace(/[.,]/g, "")
    .split(/\s+/)
    .filter((s) => s.length > 0);

console.log("Jami so'zlar :", sozlar.length);
console.log("Noyob so'zlar:", new Set(sozlar).size);

// Eng ko'p uchraydigan so'zlar
const sanoq = {};
for (const soz of sozlar) {
    sanoq[soz] = (sanoq[soz] ?? 0) + 1;
}

const eng = Object.entries(sanoq)
    .sort((a, b) => b[1] - a[1])
    .slice(0, 3);

console.log("Eng ko'p:");
for (const [soz, soni] of eng) {
    console.log(`  ${soz.padEnd(12)} ${soni} marta`);
}
Natija
Jami so'zlar : 13
Noyob so'zlar: 10
Eng ko'p:
  javascript   3 marta
  ishlaydi     2 marta
  veb          1 marta
Amaliy topshiriq
  1. Satr o'zgarmasligini matn[0] = "X" bilan isbotlang.
  2. slice va substring ni manfiy indeks bilan taqqoslang.
  3. replace faqat birinchisini almashtirishini ko'rsating.
  4. split bilan CSV qatorini qismlarga ajrating.
  5. padStart bilan vaqtni 09:05 ko'rinishida chiqaring.
  6. Shablon satri bilan ko'p qatorli xat yozing.
  7. Emoji li satr uzunligini ikki usulda o'lchang.
  8. localeCompare bilan registrsiz saralang.
  9. Regex bilan matndan barcha raqamni ajratib oling.
  10. Matndagi eng ko'p uchraydigan uch so'zni toping.

Xulosa #

  • Satrlar o'zgarmas - metodlar yangi satr qaytaradi.
  • slice ni ishlating; substring manfiy indeksni tushunmaydi.
  • replace faqat birinchisini, replaceAll hammasini.
  • split va join - satr bilan massiv o'rtasidagi ko'prik.
  • padStart raqamlarni formatlashda juda qulay.
  • Shablon satrlari birlashtirishning standart usuli.
  • length UTF-16 birliklarini sanaydi, belgilarni emas.
  • Emoji uchun [...matn] bilan bo'ling.
  • Matnni localeCompare bilan saralang.
  • Regex da \d, \w, \s va g bayrog'i eng ko'p ishlatiladi.
  • Emailni regex bilan to'liq tekshirmang - tasdiqlash xati yuboring.

Keyingi bo'limda sonlar, sana va Math bilan ishlaymiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.