JavaScript použÃvá pro ÅetÄzce kódovánà Unicode. VÄtÅ¡ina znaků je zakódována do 2 bytů, ale to umožÅuje reprezentovat nejvýše 65536 znaků.
Tento rozsah nestaÄà pro zakódovánà vÅ¡ech možných znaků, proto jsou nÄkteré vzácné znaky zakódovány do 4 bytů, napÅÃklad ð³ (matematické X) nebo ð (úsmÄv), nÄkteré hieroglyfy a podobnÄ.
Zde jsou hodnoty nÄkterých znaků v Unicode:
| Znak | Unicode | PoÄet bytů v Unicode |
|---|---|---|
| a | 0x0061 |
2 |
| â | 0x2248 |
2 |
| ð³ | 0x1d4b3 |
4 |
| ð´ | 0x1d4b4 |
4 |
| ð | 0x1f604 |
4 |
Znaky jako a a â tedy zabÃrajà 2 byty, zatÃmco kódy pro ð³, ð´ a ð jsou delšà a majà 4 byty.
PÅed delšà dobou, když JavaScript vznikl, bylo kódovánà Unicode jednoduššÃ: neobsahovalo 4-bytové znaky. NÄkteré prvky jazyka je tedy stále zpracovávajà nesprávnÄ.
NapÅÃklad length si myslÃ, že to jsou dva znaky:
alert('ð'.length); // 2
alert('ð³'.length); // 2
â¦Ale my vidÃme, že tam je jen jeden znak, že? Důvod spoÄÃvá v tom, že length zacházà se 4 byty jako se dvÄma 2-bytovými znaky. To je nekorektnÃ, protože se s nimi musà zacházet vždy spoleÄnÄ (tzv. âzástupný párâ, můžete si o nÄm pÅeÄÃst v Älánku ÅetÄzce).
Regulárnà výrazy také standardnÄ zacházejà se 4-bytovými âdlouhými znakyâ jako s párem 2-bytových. A stejnÄ jako u ÅetÄzců to může vést k podivným výsledkům. UvidÃme to o nÄco pozdÄji, v Älánku Množiny a rozsahy [...].
Na rozdÃl od ÅetÄzců vÅ¡ak regulárnà výrazy majà pÅÃznak u, který tyto problémy ÅeÅ¡Ã. S tÃmto pÅÃznakem RV zpracovává 4-bytové znaky správnÄ. RovnÄž se tÃm zpÅÃstupnà vyhledávánà podle vlastnosti v Unicode, ke kterému se dostaneme dále.
Vlastnosti Unicode \p{â¦}
Každý znak v Unicode má mnoho vlastnostÃ. Ty popisujÃ, do jaké âkategorieâ tento znak patÅÃ, a obsahujà o nÄm různé informace.
NapÅÃklad pokud znak má vlastnost Letter (pÃsmeno), znamená to, že patÅà do nÄjaké abecedy (jakéhokoli jazyka). A vlastnost Number (ÄÃslo) znamená, že to je ÄÃslice: může být arabská, ÄÃnská i jiná.
Můžeme vyhledávat znaky s urÄitou vlastnostà pomocà zápisu \p{â¦}. Abychom mohli \p{â¦} použÃt, musà regulárnà výraz obsahovat pÅÃznak u.
NapÅÃklad \p{Letter} znamená pÃsmeno v jakémkoli jazyce. Můžeme psát i \p{L}, jelikož L je zkratka pro Letter. Zkratka existuje pro témÄÅ každou vlastnost.
V následujÃcÃm pÅÃkladu můžeme najÃt pÃsmena tÅà druhů: anglické, gruzÃnské a korejské.
let str = "A á ã±";
alert( str.match(/\p{L}/gu) ); // A,á,ã±
alert( str.match(/\p{L}/g) ); // null (žádná shoda, \p nefunguje bez pÅÃznaku "u")
Hlavnà kategorie znaků a jejich podkategorie jsou následujÃcÃ:
- PÃsmeno
L:- malé
Ll, - modifikátor
Lm, - titulkové
Lt, - velké
Lu, - jiné
Lo.
- malé
- ÄÃslo
N:- desÃtková ÄÃslice
Nd, - pÃsmenné ÄÃslo
Nl, - jiné
No.
- desÃtková ÄÃslice
- InterpunkÄnà znaménko
P:- spojovnÃk
Pc, - pomlÄka
Pd, - poÄáteÄnà uvozovky
Pi, - koncové uvozovky
Pf, - otevÃracà závorka
Ps, - uzavÃracà závorka
Pe, - jiné
Po.
- spojovnÃk
- Diakritické znaménko
M(pÅÃzvuky apod.):- vedle pÃsmene (âspacing combiningâ)
Mc, - obklopujÃcÃ
Me, - nad nebo pod pÃsmenem
Mn.
- vedle pÃsmene (âspacing combiningâ)
- Symbol
S:- mÄny
Sc, - modifikátor
Sk, - matematický
Sm, - jiný
So.
- mÄny
- OddÄlovaÄ
Z:- Äára
Zl, - odstavec
Zp, - mezera
Zs.
- Äára
- Jiné
C:- ÅÃdÃcà znak
Cc, - formátovacà znak
Cf, - nepÅiÅazený
Cn, - k soukromému použitÃ
Co, - zástupný
Cs.
- ÅÃdÃcà znak
Když tedy napÅÃklad potÅebujeme malá pÃsmena, můžeme zapsat \p{Ll}, pro interpunkÄnà znaménka \p{P} a tak dále.
Existujà i jiné odvozené kategorie, napÅÃklad:
Alphabetic(Alpha), obsahuje pÃsmenaL, pÃsmenná ÄÃslaNl(napÅ. â « â znak pro ÅÃmské ÄÃslo 12) a nÄkteré dalšà symbolyOther_Alphabetic(OAlpha).Hex_Digitobsahuje hexadecimálnà ÄÃslice:0-9,a-f.- â¦a podobnÄ.
Unicode podporuje mnoho různých vlastnostà a jejich úplný seznam by zabral spoustu mÃsta, proto uvádÃme odkazy:
- Seznam všech vlastnostà podle znaků: https://unicode.org/cldr/utility/character.jsp.
- Seznam vÅ¡ech znaků podle vlastnostÃ: https://unicode.org/cldr/utility/list-unicodeset.jsp.
- Zkratky vlastnostÃ: https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt.
- Ãplný seznam znaků v Unicode v textovém formátu se vÅ¡emi vlastnostmi je zde: https://www.unicode.org/Public/UCD/latest/ucd/.
PÅÃklad: ÄÃsla v Å¡estnáctkové soustavÄ
Hledejme napÅÃklad ÄÃsla v Å¡estnáctkové soustavÄ zapsaná jako xFF, kde F je hexadecimálnà ÄÃslice (0â¦9 nebo Aâ¦F).
Hexadecimálnà ÄÃslici můžeme zapsat jako \p{Hex_Digit}:
let rv = /x\p{Hex_Digit}\p{Hex_Digit}/u;
alert("ÄÃslo: xAF".match(rv)); // xAF
PÅÃklad: ÄÃnské hieroglyfy
Hledejme ÄÃnské hieroglyfy.
V Unicode existuje vlastnost Script (pÃsmenná soustava), která může mÃt hodnotu: Cyrillic, Greek, Arabic, Han (ÄÃnská) a tak dále, úplný seznam je zde.
Pro hledánà znaků urÄité pÃsmenné soustavy bychom mÄli použÃt Script=<hodnota>, napÅ. pro pÃsmena kyrilice: \p{sc=Cyrillic}, pro ÄÃnské hieroglyfy: \p{sc=Han}, a tak dále:
let rv = /\p{sc=Han}/gu; // vrátà ÄÃnské hieroglyfy
let ÅetÄzec = `Ahoj ÐÑÐ¸Ð²ÐµÑ ä½ å¥½ 123_456`;
alert( ÅetÄzec.match(rv) ); // ä½ ,好
PÅÃklad: mÄna
Znaky, které oznaÄujà mÄnu, napÅÃklad $, â¬, Â¥, majà v Unicode vlastnost \p{Currency_Symbol}, zkratka: \p{Sc}.
Použijme ji pro hledánà cen ve formátu âmÄna následovaná ÄÃslicÃâ:
let rv = /\p{Sc}\d/gu;
let ÅetÄzec = `Ceny: $2, â¬1, Â¥9`;
alert( ÅetÄzec.match(rv) ); // $2,â¬1,Â¥9
PozdÄji, v Älánku Kvantifikátory +, *, ? a {n}, uvidÃme, jak najÃt ÄÃsla obsahujÃcà vÃce ÄÃslic.
ShrnutÃ
PÅÃznak u umožÅuje podporu Unicode v regulárnÃch výrazech.
To znamená dvÄ vÄci:
- Znaky o délce 4 byty budou zpracovány správnÄ: jako jediný znak, ne jako dva 2-bytové znaky.
- Pro hledánà můžeme použÃt vlastnosti v Unicode:
\p{â¦}.
Pomocà vlastnostà v Unicode můžeme hledat slova v urÄitém jazyce, speciálnà znaky (uvozovky, mÄny) a podobnÄ.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)