6 сентябр 2025

Ekranlash, maxsus belgilar

Ko’rib turganimizdek, teskari chiziq \ belgilar sinflarini belgilash uchun ishlatiladi, masalan \d. Demak, bu regexplarda maxsus belgi (oddiy satrlardagi kabi).

Regexpda maxsus ma’noga ega bo’lgan boshqa maxsus belgilar ham bor. Ular yanada kuchli qidiruvlar uchun ishlatiladi. Mana ularning to’liq ro’yxati: [ \ ^ $ . | ? * + ( ).

Ro’yxatni yodlashga harakat qilmang – tez orada har birini alohida ko’rib chiqamiz va siz ularni avtomatik ravishda yoddan bilasiz.

Ekranlash

Aytaylik, biz tom ma’noda nuqtani topmoqchimiz. “Har qanday belgi” emas, balki shunchaki nuqta.

Maxsus belgini oddiy belgi sifatida ishlatish uchun uning oldiga teskari chiziq qo’ying: \..

Bu “belgini ekranlash” deb ham ataladi.

Masalan:

alert( "Chapter 5.1".match(/\d\.\d/) ); // 5.1 (moslik!)
alert( "Chapter 511".match(/\d\.\d/) ); // null (haqiqiy nuqta \. ni qidirmoqda)

Qavslar ham maxsus belgilar, shuning uchun agar ularni xohlasak, \( ishlatishimiz kerak. Quyidagi misol "g()" satrini qidiradi:

alert( "function g()".match(/g\(\)/) ); // "g()"

Agar biz teskari chiziq \ ni qidirmoqdamiz, u ham oddiy satrlar ham regexplarda maxsus belgi, shuning uchun uni ikki marta yozishimiz kerak.

alert( "1\\2".match(/\\/) ); // '\'

Qiyshiq chiziq

Qiyshiq chiziq belgisi '/' maxsus belgi emas, lekin JavaScript-da u regexpni ochish va yopish uchun ishlatiladi: /...pattern.../, shuning uchun uni ham ekranlashimiz kerak.

Mana qiyshiq chiziq '/' ni qidirishning ko’rinishi:

alert( "/".match(/\//) ); // '/'

Boshqa tomondan, agar biz /.../ ishlatmasdan, balki new RegExp yordamida regexp yaratsak, uni ekranlashimiz shart emas:

alert( "/".match(new RegExp("/")) ); // / ni topadi

new RegExp

Agar biz new RegExp bilan doimiy ifoda yaratayotgan bo’lsak, / ni ekranlashimiz shart emas, lekin boshqa ekranlashlarni qilishimiz kerak.

Masalan, buni ko’rib chiqing:

let regexp = new RegExp("\d\.\d");

alert( "Chapter 5.1".match(regexp) ); // null

Oldingi misollardan birida xuddi shunday qidiruv /\d\.\d/ bilan ishladi, lekin new RegExp("\d\.\d") ishlamaydi, nega?

Sababi shundaki, teskari chiziqlar satr tomonidan “iste’mol qilinadi”. Eslaymizki, oddiy satrlar o’zining maxsus belgilariga ega, masalan \n, va teskari chiziq ekranlash uchun ishlatiladi.

Mana “\d.\d” qanday qabul qilinadi:

alert("\d\.\d"); // d.d

Satr qo’shtirnoqlari teskari chiziqlarni “iste’mol qiladi” va ularni o’z-o’zidan talqin qiladi, masalan:

  • \n – yangi qator belgisiga aylanadi,
  • \u1234 – bunday kodga ega Unicode belgisiga aylanadi,
  • …Va maxsus ma’no bo’lmaganda: \d yoki \z kabi, teskari chiziq shunchaki olib tashlanadi.

Shunday qilib, new RegExp teskari chiziqsiz satr oladi. Shuning uchun qidiruv ishlamaydi!

Buni tuzatish uchun biz teskari chiziqlarni ikki marta yozishimiz kerak, chunki satr qo’shtirnoqlari \\ ni \ ga aylantiradi:

let regStr = "\\d\\.\\d";
alert(regStr); // \d\.\d (endi to'g'ri)

let regexp = new RegExp(regStr);

alert( "Chapter 5.1".match(regexp) ); // 5.1

Xulosa

  • Maxsus belgilar [ \ ^ $ . | ? * + ( ) ni tom ma’noda qidirish uchun ularning oldiga teskari chiziq \ qo’yishimiz kerak (“ularni ekranlash”).
  • Agar biz /.../ ichida bo’lsak, / ni ham ekranlashimiz kerak (lekin new RegExp ichida emas).
  • new RegExp ga satr uzatishda biz teskari chiziqlarni ikki marta \\ yozishimiz kerak, chunki satr qo’shtirnoqlari ulardan birini iste’mol qiladi.
O'quv qo'llanma xaritasi

Izohlar

izoh berishdan oldin buni o'qing…
  • Agar sizda nimani yaxshilash kerakligi haqida takliflaringiz bo'lsa - iltimos, GitHub muammosini yuboring yoki izoh berish o'rniga so'rov yuboring.
  • Agar siz maqolada biror narsani tushunolmasangiz - iltimos, batafsilroq ma'lumot bering.
  • Bir nechta so'z so'zlarini kiritish uchun <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…)