JavaScript satrlar uchun Unicode kodlashdan foydalanadi. Ko’pgina belgilar 2 bayt bilan kodlanadi, lekin bu ko’pi bilan 65536 belgini ifodalash imkonini beradi.
Bu diapazon barcha mumkin bo’lgan belgilarni kodlash uchun etarli emas, shuning uchun ba’zi kam uchraydigan belgilar 4 bayt bilan kodlanadi, masalan 𝒳
(matematik X) yoki 😄
(tabassum), ba’zi ierogliflar va hokazo.
Mana ba’zi belgilarning Unicode qiymatlari:
Belgi | Unicode | Unicode dagi baytlar soni |
---|---|---|
a | 0x0061 |
2 |
≈ | 0x2248 |
2 |
𝒳 | 0x1d4b3 |
4 |
𝒴 | 0x1d4b4 |
4 |
😄 | 0x1f604 |
4 |
Shunday qilib, a
va ≈
kabi belgilar 2 baytni egallaydi, 𝒳
, 𝒴
va 😄
uchun kodlar esa uzunroq, ular 4 baytga ega.
Uzoq vaqt oldin, JavaScript tili yaratilganda, Unicode kodlash oddiyroq edi: 4 baytli belgilar yo’q edi. Shuning uchun ba’zi til xususiyatlari hali ham ularni noto’g’ri boshqaradi.
Masalan, length
bu yerda ikkita belgi borligini hisoblaydi:
alert('😄'.length); // 2
alert('𝒳'.length); // 2
…Lekin biz faqat bittasini ko’rishimiz mumkin, to’g’rimi? Gap shundaki, length
4 baytni ikkita 2 baytli belgi sifatida ko’radi. Bu noto’g’ri, chunki ular faqat birgalikda ko’rib chiqilishi kerak (“surrogate pair” deb ataladi, ular haqida Satrlar maqolasida o’qishingiz mumkin).
Sukut bo’yicha, doimiy ifodalar ham 4 baytli "uzun belgilar"ni 2 baytli juftlik sifatida ko’radi. Va satrlar bilan bo’lgani kabi, bu g’alati natijalarga olib kelishi mumkin. Buni biroz keyinroq To'plamlar va diapazonlar [...] maqolasida ko’ramiz.
Satrlardan farqli o’laroq, doimiy ifodalarda bunday muammolarni hal qiluvchi u
bayrog’i mavjud. Bunday bayroq bilan regexp 4 baytli belgilarni to’g’ri boshqaradi. Shuningdek, Unicode xususiyatlari bo’yicha qidiruv imkoni paydo bo’ladi, bunga keyinroq o’tamiz.
Unicode xususiyatlari \p{…}
Unicode-da har bir belgi ko’plab xususiyatlarga ega. Ular belgi qaysi "toifa"ga tegishli ekanligini tasvirlaydi, u haqida turli ma’lumotlarni o’z ichiga oladi.
Masalan, agar belgida Letter
xususiyati bo’lsa, bu belgi alifboga (har qanday tilning) tegishli ekanligini anglatadi. Va Number
xususiyati bu raqam ekanligini bildiradi: arab yoki xitoy va hokazo.
Biz \p{…}
ko’rinishida yozilgan xususiyatga ega belgilarni qidira olamiz. \p{…}
dan foydalanish uchun doimiy ifoda u
bayrog’iga ega bo’lishi kerak.
Masalan, \p{Letter}
har qanday tildagi harfni bildiradi. Shuningdek, \p{L}
dan ham foydalanishimiz mumkin, chunki L
– Letter
ning taxallusi. Deyarli har bir xususiyat uchun qisqaroq taxalluslar mavjud.
Quyidagi misolda uch xil harflar topiladi: ingliz, gruzin va koreys.
let str = "A ბ ㄱ";
alert( str.match(/\p{L}/gu) ); // A,ბ,ㄱ
alert( str.match(/\p{L}/g) ); // null (moslik yo'q, \p "u" bayrog'isiz ishlamaydi)
Mana asosiy belgilar toifalari va ularning kichik toifalari:
- Harf
L
:- kichik harf
Ll
- modifikator
Lm
, - bosh harf
Lt
, - katta harf
Lu
, - boshqa
Lo
.
- kichik harf
- Raqam
N
:- o’nli raqam
Nd
, - harf raqami
Nl
, - boshqa
No
.
- o’nli raqam
- Tinish belgilari
P
:- bog’lovchi
Pc
, - tire
Pd
, - boshlang’ich tirnoq
Pi
, - oxirgi tirnoq
Pf
, - ochuvchi
Ps
, - yopuvchi
Pe
, - boshqa
Po
.
- bog’lovchi
- Belgi
M
(urg’u va boshqalar):- bo’shliq birlashuvchi
Mc
, - o’rab oluvchi
Me
, - bo’shliqsiz
Mn
.
- bo’shliq birlashuvchi
- Ramz
S
:- valyuta
Sc
, - modifikator
Sk
, - matematik
Sm
, - boshqa
So
.
- valyuta
- Ajratuvchi
Z
:- qator
Zl
, - paragraf
Zp
, - bo’shliq
Zs
.
- qator
- Boshqa
C
:- boshqaruv
Cc
, - format
Cf
, - tayinlanmagan
Cn
, - shaxsiy foydalanish
Co
, - surrogate
Cs
.
- boshqaruv
Shunday qilib, masalan, agar bizga kichik harflar kerak bo’lsa, \p{Ll}
yozishimiz mumkin, tinish belgilari: \p{P}
va hokazo.
Boshqa hosila toifalar ham mavjud, masalan:
Alphabetic
(Alpha
), HarflarL
, harf raqamlariNl
(masalan, Ⅻ – rim raqami 12 uchun belgi), va boshqa ba’zi ramzlarOther_Alphabetic
(OAlpha
) ni o’z ichiga oladi.Hex_Digit
o’n oltilik raqamlarni o’z ichiga oladi:0-9
,a-f
.- …Va hokazo.
Unicode ko’plab turli xususiyatlarni qo’llab-quvvatlaydi, ularning to’liq ro’yxati ko’p joy talab qiladi, shuning uchun mana havolalar:
- Belgi bo’yicha barcha xususiyatlar ro’yxati: https://unicode.org/cldr/utility/character.jsp.
- Xususiyat bo’yicha barcha belgilar ro’yxati: https://unicode.org/cldr/utility/list-unicodeset.jsp.
- Xususiyatlar uchun qisqa taxalluslar: https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt.
- Barcha xususiyatlar bilan matn formatidagi Unicode belgilarining to’liq bazasi: https://www.unicode.org/Public/UCD/latest/ucd/.
Misol: o’n oltilik raqamlar
Masalan, xFF
ko’rinishida yozilgan o’n oltilik raqamlarni qidiraylik, bu yerda F
hex raqam (0…9 yoki A…F).
Hex raqam \p{Hex_Digit}
ko’rinishida belgilanishi mumkin:
let regexp = /x\p{Hex_Digit}\p{Hex_Digit}/u;
alert("number: xAF".match(regexp)); // xAF
Misol: Xitoy ierogliflari
Xitoy ierogliflarini qidiraylik.
Script
(yozuv tizimi) Unicode xususiyati mavjud, u quyidagi qiymatlarga ega bo’lishi mumkin: Cyrillic
, Greek
, Arabic
, Han
(Xitoy) va hokazo, to’liq ro’yxat shu yerda.
Berilgan yozuv tizimidagi belgilarni qidirish uchun Script=<qiymat>
dan foydalanishimiz kerak, masalan kirill harflari uchun: \p{sc=Cyrillic}
, xitoy ierogliflari uchun: \p{sc=Han}
, va hokazo:
let regexp = /\p{sc=Han}/gu; // xitoy ierogliflarini qaytaradi
let str = `Hello Привет 你好 123_456`;
alert( str.match(regexp) ); // 你,好
Misol: valyuta
$
, €
, ¥
kabi valyutani bildiruvchi belgilar \p{Currency_Symbol}
Unicode xususiyatiga ega, qisqa taxallus: \p{Sc}
.
“Valyuta, keyin raqam” formatidagi narxlarni qidirish uchun undan foydalanamiz:
let regexp = /\p{Sc}\d/gu;
let str = `Prices: $2, €1, ¥9`;
alert( str.match(regexp) ); // $2,€1,¥9
Keyinroq, Miqdorchilar +, *, ? va {n} maqolasida ko’plab raqamlarni o’z ichiga olgan raqamlarni qanday qidirishni ko’ramiz.
Xulosa
u
bayrog’i doimiy ifodalarda Unicode qo’llab-quvvatlashni yoqadi.
Bu ikki narsani anglatadi:
- 4 baytli belgilar to’g’ri boshqariladi: bitta belgi sifatida, ikkita 2 baytli belgi emas.
- Unicode xususiyatlari qidiruvda ishlatilishi mumkin:
\p{…}
.
Unicode xususiyatlari bilan biz berilgan tillardagi so’zlar, maxsus belgilar (qo’shtirnoqlar, valyutalar) va hokazolarni qidirishimiz mumkin.
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…)