# JavaScript regulyar ifodalar (RegExp)

> Regex asoslari: naqsh yozish, test va match metodlari, belgi sinflari, miqdor belgilari, guruhlar va replace. Matnni tekshirish va ajratishni o'rganing.

Manba: https://learncode.uz/javascript/regex/
Sana: 2026-06-04

Email to'g'rimi? Matndan barcha raqamlarni ajratish kerakmi? Bunday vazifalar
uchun [matn metodlari](https://learncode.uz/javascript/matn-metodlari) yetmaydi — **regulyar
ifoda** kerak.

## Naqsh yozish

> **Atama**
>
> **Regulyar ifoda** (regex) — matn ichidan **naqsh** bo'yicha qidirish uchun
> maxsus yozuv. JavaScript'da ikki shaklda yoziladi: `/naqsh/` yoki
> `new RegExp("naqsh")`.

```js
const pattern = /kod/;

console.log(pattern.test("men kod yozaman"));
console.log(pattern.test("men dastur yozaman"));

console.log("men kod yozaman".match(pattern)[0]);
```

`test` — bormi yoki yo'q (`true`/`false`); `match` — topilgan qismni beradi.

## Bayroqlar

```js
const text = "Kod, kod va yana KOD";

console.log(text.match(/kod/));

console.log(text.match(/kod/gi));

console.log(text.match(/kod/gi).length);
```

- `g` — **global**: barcha mosliklarni topadi, birinchisida to'xtamaydi;
- `i` — **katta-kichik harfni farqlamaydi**.

## Belgi sinflari

```js
const text = "Telefon: +998 90 123 45 67";

console.log(text.match(/\d/g));

console.log(text.match(/\d+/g));

console.log("salom dunyo".match(/\w+/g));
```

Asosiy sinflar:

| Belgi | Ma'nosi |
|---|---|
| `\d` | Raqam (0-9) |
| `\w` | Harf, raqam yoki `_` |
| `\s` | Bo'sh joy |
| `.` | Istalgan belgi |
| `[abc]` | `a`, `b` yoki `c` |
| `[^abc]` | `a`, `b`, `c` **dan boshqa** |
| `[a-z]` | `a` dan `z` gacha |

Katta harf bilan yozilsa — teskarisi: `\D` raqam **emas**, `\S` bo'sh joy
**emas**.

## Miqdor belgilari

```js
console.log("aaa".match(/a+/)[0]);
console.log("abc".match(/a*/)[0]);
console.log("color colour".match(/colou?r/g));

console.log("2026-09-09".match(/\d{4}/)[0]);
console.log("123456".match(/\d{2,4}/)[0]);
```

| Belgi | Ma'nosi |
|---|---|
| `+` | Bir yoki ko'p |
| `*` | Nol yoki ko'p |
| `?` | Nol yoki bitta |
| `{3}` | Aynan 3 ta |
| `{2,4}` | 2 dan 4 gacha |
| `{2,}` | 2 va undan ko'p |

## Boshi va oxiri

```js
console.log(/^Salom/.test("Salom dunyo"));
console.log(/^Salom/.test("Men Salom dedim"));

console.log(/dunyo$/.test("Salom dunyo"));

console.log(/^\d+$/.test("12345"));
console.log(/^\d+$/.test("123a5"));
```

`^` — matn boshi, `$` — oxiri. Ikkalasi birga qo'yilsa, **butun matn**
naqshga mos kelishi talab qilinadi. Tekshiruvda bu deyarli har doim kerak.

## Amaliy tekshiruvlar

```js
function validate(pattern, qiymatlar) {
  for (const q of qiymatlar) {
    console.log(pattern.test(q) ? "✓ " + q : "✗ " + q);
  }
}

const email = /^[\w.-]+@[\w-]+\.[a-z]{2,}$/i;
validate(email, ["aziz@mail.uz", "aziz@mail", "a.b-c@sayt.co.uk"]);

console.log("—");

const phone = /^\+998\d{9}$/;
validate(phone, ["+998901234567", "+99890123", "998901234567"]);
```

> **Email tekshiruvi haqida**
>
> To'liq email standartini regex bilan qamrash deyarli imkonsiz. Yuqoridagi
> naqsh — amaliy yetarli variant. Haqiqiy tasdiqlash esa **tasdiqlash xati
> yuborish** orqali qilinadi.

## Guruhlar

Qavs naqsh qismini ajratib oladi:

```js
const date = "2026-09-09";
const pattern = /(\d{4})-(\d{2})-(\d{2})/;

const result = date.match(pattern);

console.log(result[0]);
console.log(result[1]);
console.log(result[2]);
console.log(result[3]);
```

Nomlangan guruhlar o'qishni osonlashtiradi:

```js
const pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;

const { groups } = "2026-09-09".match(pattern);

console.log(groups.year, groups.month, groups.day);
```

## replace bilan almashtirish

```js
const text = "Narx: 15000 so'm, chegirma: 3000 so'm";

console.log(text.replace(/\d+/g, "***"));

const date = "2026-09-09";
console.log(date.replace(/(\d{4})-(\d{2})-(\d{2})/, "$3.$2.$1"));

console.log("  ko'p    bo'sh   joy  ".replace(/\s+/g, " ").trim());
```

`$1`, `$2` — guruhlarga murojaat. Oxirgi misol — matnni tozalashning
standart usuli.

Funksiya bilan yanada moslashuvchan:

```js
const text = "apple 3, banan 5, uzum 2";

const result = text.replace(/\d+/g, (num) => Number(num) * 2);

console.log(result);
```

## matchAll — barcha guruhlar bilan

```js
const text = "Aziz: 85, Dilnoza: 92, Bobur: 78";
const pattern = /(\w+): (\d+)/g;

for (const m of text.matchAll(pattern)) {
  console.log(m[1], "→", Number(m[2]));
}
```

`match` faqat mosliklarni beradi; `matchAll` esa har biri uchun guruhlarni
ham qaytaradi.

## split bilan ajratish

```js
console.log("apple,banan;uzum  nok".split(/[,;\s]+/));
```

Bir nechta ajratuvchi bir vaqtda ishlatilishi mumkin.

## Amaliy mashq

1. Matndan barcha raqamlarni `\d+` bilan ajrating;
2. `^` va `$` bilan butun matn faqat harflardan iboratligini tekshiring;
3. email naqshini yozib, uch xil qiymatda sinang;
4. sanani `dd.mm.yyyy` shakliga `replace` bilan o'giring;
5. nomlangan guruh bilan telefon raqamini qismlarga ajrating;
6. `matchAll` bilan "nom: ball" juftliklarini yig'ing.

## Qisqacha xulosa

- Regex `/naqsh/bayroq` shaklida yoziladi; `g` — barchasi, `i` — harf farqsiz.
- `test` mosligini tekshiradi, `match` va `matchAll` topilganini beradi.
- `\d`, `\w`, `\s` — belgi sinflari; `+`, `*`, `?`, `{n,m}` — miqdor.
- `^` va `$` matn boshi va oxirini belgilaydi — tekshiruvda majburiy.
- Qavs guruh yaratadi; `$1` yoki nomlangan `groups` orqali olinadi.
- `replace` matn yoki funksiya bilan almashtiradi.

Keyingi darsda [timer funksiyalari](https://learncode.uz/javascript/timerlar) — vaqt bo'yicha
kod bajarish.
