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 â Letterning 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_Digitoâ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â¦)