Ð JavaScript Ð´Ð»Ñ ÑÑÑок иÑполÑзÑеÑÑÑ ÐºÐ¾Ð´Ð¸Ñовка Юникод. ÐбÑÑно ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ÐºÐ¾Ð´Ð¸ÑÑÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ 2 байÑов, ÑÑо позволÑÐµÑ Ð·Ð°ÐºÐ¾Ð´Ð¸ÑоваÑÑ Ð¼Ð°ÐºÑимÑм 65536 Ñимволов.
ÐÑого диапазона не Ñ
ваÑÐ°ÐµÑ Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð·Ð°ÐºÐ¾Ð´Ð¸ÑоваÑÑ Ð²Ñе ÑимволÑ. ÐоÑÑÐ¾Ð¼Ñ Ð½ÐµÐºÐ¾ÑоÑÑе Ñедкие ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ÐºÐ¾Ð´Ð¸ÑÑÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ 4 байÑов, напÑÐ¸Ð¼ÐµÑ ð³ (маÑемаÑиÑеÑкий X) или ð (Ñмайлик), некоÑоÑÑе иеÑоглиÑÑ, и Ñ.п.
Ð ÑаблиÑе ниже пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð®Ð½Ð¸ÐºÐ¾Ð´Ñ Ð½ÐµÑколÑÐºÐ¸Ñ Ñимволов:
| Символ | Юникод | ÐолиÑеÑÑво Ð±Ð°Ð¹Ñ Ð² Юникоде |
|---|---|---|
| a | 0x0061 |
2 |
| â | 0x2248 |
2 |
| ð³ | 0x1d4b3 |
4 |
| ð´ | 0x1d4b4 |
4 |
| ð | 0x1f604 |
4 |
Таким обÑазом, ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ñипа a и â занимаÑÑ Ð¿Ð¾ 2 байÑа, а ÐºÐ¾Ð´Ñ Ð´Ð»Ñ ð³, ð´ и ð â длиннее, в ниÑ
4 байÑа.
Ðогда-Ñо давно, на Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑзÑка JavaScript, кодиÑовка Юникод бÑла пÑоÑе: Ñимволов в 4 байÑа не ÑÑÑеÑÑвовало. Ð, Ñ Ð¾ÑÑ ÑÑо вÑÐµÐ¼Ñ Ð´Ð°Ð²Ð½Ð¾ пÑоÑло, многие ÑÑÑоковÑе ÑÑнкÑии вÑÑ ÐµÑÑ Ð¼Ð¾Ð³ÑÑ ÑабоÑаÑÑ Ð½ÐµÐºÐ¾ÑÑекÑно.
ÐапÑимеÑ, ÑвойÑÑво length ÑÑиÑаеÑ, ÑÑо здеÑÑ Ð´Ð²Ð° Ñимвола:
alert('ð'.length); // 2
alert('ð³'.length); // 2
â¦Ðо Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼, ÑÑо ÑолÑко один, веÑно? Ðело в Ñом, ÑÑо ÑвойÑÑво length воÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ 4-байÑовÑй Ñимвол как два Ñимвола по 2 байÑа. ÐÑо невеÑно, поÑÐ¾Ð¼Ñ ÑÑо ÑÑи два Ñимвола Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ð¾ÑпÑинимаÑÑÑÑ ÐºÐ°Ðº единое Ñелое (Ñак назÑÐ²Ð°ÐµÐ¼Ð°Ñ Â«ÑÑÑÑогаÑÐ½Ð°Ñ Ð¿Ð°Ñа», Ð²Ñ Ñакже можеÑе пÑоÑиÑаÑÑ Ð¾Ð± ÑÑом в главе СÑÑоки).
РегÑлÑÑнÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñакже по ÑмолÑÐ°Ð½Ð¸Ñ Ð²Ð¾ÑпÑинимаÑÑ 4-байÑнÑе «длиннÑе ÑимволÑ» как паÑÑ 2-байÑнÑÑ . Ðак и Ñо ÑÑÑоками, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑиводиÑÑ Ðº ÑÑÑаннÑм ÑезÑлÑÑаÑам. ÐÑ Ñвидим пÑимеÑÑ ÑÑÑÑ Ð¿Ð¾Ð·Ð¶Ðµ, в главе ÐабоÑÑ Ð¸ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ [...].
РоÑлиÑие Ð¾Ñ ÑÑÑок, Ñ ÑегÑлÑÑнÑÑ
вÑÑажений еÑÑÑ ÑпеÑиалÑнÑй Ñлаг u, коÑоÑÑй иÑпÑавлÑÐµÑ ÑÑÑ Ð¿ÑоблемÑ. ÐÑи его налиÑии ÑегÑлÑÑное вÑÑажение ÑабоÑÐ°ÐµÑ Ñ 4-байÑнÑми Ñимволами пÑавилÑно. Ð, кÑоме Ñого, ÑÑановиÑÑÑ Ð´Ð¾ÑÑÑпнÑм поиÑк по ЮникоднÑм ÑвойÑÑвам, коÑоÑÑй Ð¼Ñ ÑаÑÑмоÑÑим далее.
ЮникоднÑе ÑвойÑÑва \p{â¦}
ÐÐ°Ð¶Ð´Ð¾Ð¼Ñ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð² кодиÑовке Юникод ÑооÑвеÑÑÑвÑÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво ÑвойÑÑв. Ðни опиÑÑваÑÑ Ðº какой «каÑегоÑии» оÑноÑиÑÑÑ Ñимвол, ÑодеÑÐ¶Ð°Ñ ÑазлиÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ нÑм.
ÐапÑимеÑ, ÑвойÑÑво Letter Ñ Ñимвола ознаÑаеÑ, ÑÑо ÑÑо бÑква какого-Ñо алÑавиÑа, пÑиÑÑм лÑбого. Ð ÑвойÑÑво Number ознаÑаеÑ, ÑÑо ÑÑо ÑиÑÑа: возможно, аÑабÑÐºÐ°Ñ Ð¸Ð»Ð¸ киÑайÑкаÑ, и Ñ.д.
Ð ÑегÑлÑÑном вÑÑажении можно иÑкаÑÑ Ñимвол Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм ÑвойÑÑвом, Ñказав его в \p{â¦}. ÐÐ»Ñ ÑакиÑ
ÑегÑлÑÑнÑÑ
вÑÑажений обÑзаÑелÑно иÑполÑзоваÑÑ Ñлаг u.
ÐапÑимеÑ, \p{Letter} обознаÑÐ°ÐµÑ Ð±ÑÐºÐ²Ñ Ð² лÑбом ÑзÑке. Также можно иÑполÑзоваÑÑ Ð·Ð°Ð¿Ð¸ÑÑ \p{L}, Ñак как L â ÑÑо пÑевдоним Letter. СÑÑеÑÑвÑÑÑ ÐºÐ¾ÑоÑкие запиÑи поÑÑи Ð´Ð»Ñ Ð²ÑеÑ
ÑвойÑÑв.
РпÑимеÑе ниже бÑдÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ñ Ð°Ð½Ð³Ð»Ð¸Ð¹ÑкаÑ, гÑÑзинÑÐºÐ°Ñ Ð¸ коÑейÑÐºÐ°Ñ Ð±ÑквÑ:
let str = "A á ã±";
alert( str.match(/\p{L}/gu) ); // A,á,ã±
alert( str.match(/\p{L}/g) ); // null (ниÑего не наÑло, Ñак как \p не ÑабоÑÐ°ÐµÑ Ð±ÐµÐ· Ñлага "u")
ÐÐ¾Ñ Ð¾ÑновнÑе каÑегоÑии Ñимволов и Ð¸Ñ Ð¿Ð¾Ð´ÐºÐ°ÑегоÑии:
- ÐÑквÑ
L:- в нижнем ÑегиÑÑÑе
Ll, - модиÑикаÑоÑÑ
Lm, - заглавнÑе бÑквÑ
Lt, - в веÑÑ
нем ÑегиÑÑÑе
Lu, - пÑоÑие
Lo.
- в нижнем ÑегиÑÑÑе
- ЧиÑла
N:- деÑÑÑиÑÐ½Ð°Ñ ÑиÑÑа
Nd, - ÑиÑÑÑ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑаемÑе бÑквами (ÑимÑкие)
Nl, - пÑоÑие
No.
- деÑÑÑиÑÐ½Ð°Ñ ÑиÑÑа
- Ðнаки пÑнкÑÑаÑии
P:- ÑоединиÑели
Pc, - ÑиÑе
Pd, - оÑкÑÑваÑÑие кавÑÑки
Pi, - закÑÑваÑÑие кавÑÑки
Pf, - оÑкÑÑваÑÑие Ñкобки
Ps, - закÑÑваÑÑие Ñкобки
Pe, - пÑоÑее
Po.
- ÑоединиÑели
- ÐÑмеÑки
M(напÑимеÑ, акÑенÑÑ):- двоеÑоÑиÑ
Mc, - вложениÑ
Me, - апоÑÑÑоÑÑ
Mn.
- двоеÑоÑиÑ
- СимволÑ
S:- валÑÑÑ
Sc, - модиÑикаÑоÑÑ
Sk, - маÑемаÑиÑеÑкие
Sm, - пÑоÑие
So.
- валÑÑÑ
- РазделиÑели
Z:- линиÑ
Zl, - паÑагÑаÑ
Zp, - пÑобел
Zs.
- линиÑ
- ÐÑоÑие
C:- конÑÑолÑнÑе
Cc, - ÑоÑмаÑиÑование
Cf, - не назнаÑеннÑе
Cn, - Ð´Ð»Ñ Ð¿ÑиваÑного иÑполÑзованиÑ
Co, - ÑÑÑÑогаÑÑ
Cs.
- конÑÑолÑнÑе
Так ÑÑо, напÑимеÑ, еÑли нам нÑÐ¶Ð½Ñ Ð±ÑÐºÐ²Ñ Ð² нижнем ÑегиÑÑÑе, Ñо можно напиÑаÑÑ \p{Ll}, знаки пÑнкÑÑаÑии: \p{P} и Ñак далее.
ÐÑÑÑ Ð¸ дÑÑгие каÑегоÑии â пÑоизводнÑе, напÑимеÑ:
Alphabetic(Alpha), вклÑÑаÑÑÐ°Ñ Ð² ÑÐµÐ±Ñ Ð±ÑквÑL, плÑÑ Â«Ð±ÑквеннÑе ÑиÑÑÑ»Nl(напÑÐ¸Ð¼ÐµÑ â « â Ñимвол Ð´Ð»Ñ ÑимÑкой запиÑи ÑиÑла 12), и некоÑоÑÑе дÑÑгие ÑимволÑOther_Alphabetic(OAlpha).Hex_DigitвклÑÑÐ°ÐµÑ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð´Ð»Ñ ÑеÑÑнадÑаÑеÑиÑнÑÑ ÑиÑел:0-9,a-f.- Ð Ñак далее.
Юникод поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¼Ð½Ð¾Ð³Ð¾ ÑазлиÑнÑÑ ÑвойÑÑв, Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾Ðµ пеÑеÑиÑление поÑÑебовало Ð±Ñ Ð¾ÑÐµÐ½Ñ Ð¼Ð½Ð¾Ð³Ð¾ меÑÑа, поÑÑÐ¾Ð¼Ñ Ð²Ð¾Ñ ÑÑÑлки:
- Ðо ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¿Ð¾ÑмоÑÑеÑÑ ÐµÐ³Ð¾ ÑвойÑÑва: https://unicode.org/cldr/utility/character.jsp.
- Ðо ÑвойÑÑÐ²Ñ Ð¿Ð¾ÑмоÑÑеÑÑ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ñ Ð½Ð¸Ð¼: https://unicode.org/cldr/utility/list-unicodeset.jsp.
- ÐоÑоÑкие пÑÐµÐ²Ð´Ð¾Ð½Ð¸Ð¼Ñ Ð´Ð»Ñ ÑвойÑÑв: https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt.
- ÐÐ¾Ð»Ð½Ð°Ñ Ð±Ð°Ð·Ð° Юникод-Ñимволов в ÑекÑÑовом ÑоÑмаÑе вмеÑÑе Ñо вÑеми ÑвойÑÑвами, Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð·Ð´ÐµÑÑ: https://www.unicode.org/Public/UCD/latest/ucd/.
ÐÑимеÑ: ÑеÑÑнадÑаÑеÑиÑнÑе ÑиÑла
ÐапÑимеÑ, давайÑе поиÑем ÑеÑÑнадÑаÑеÑиÑнÑе ÑиÑла, запиÑаннÑе в ÑоÑмаÑе xFF, где вмеÑÑо F Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»ÑÐ±Ð°Ñ ÑеÑÑнадÑаÑеÑиÑÐ½Ð°Ñ ÑиÑÑа (0â¦9 или Aâ¦F).
ШеÑÑнадÑаÑеÑиÑÐ½Ð°Ñ ÑиÑÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð±Ð¾Ð·Ð½Ð°Ñена как \p{Hex_Digit}:
let regexp = /x\p{Hex_Digit}\p{Hex_Digit}/u;
alert("ÑиÑло: xAF".match(regexp)); // xAF
ÐÑимеÑ: киÑайÑкие иеÑоглиÑÑ
ÐоиÑем киÑайÑкие иеÑоглиÑÑ.
РЮникоде еÑÑÑ ÑвойÑÑво Script (ÑиÑÑема напиÑаниÑ), коÑоÑое Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Cyrillic (ÐиÑиллиÑеÑкаÑ), Greek (ÐÑеÑеÑкаÑ), Arabic (ÐÑабÑкаÑ), Han (ÐиÑайÑкаÑ) и Ñак далее, здеÑÑ Ð¿Ð¾Ð»Ð½Ñй ÑпиÑок.
ÐÐ»Ñ Ð¿Ð¾Ð¸Ñка Ñимволов в нÑжной ÑиÑÑеме Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑÑановиÑÑ Script=<знаÑение>, напÑÐ¸Ð¼ÐµÑ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка киÑиллиÑеÑкиÑ
бÑкв: \p{sc=Cyrillic}, Ð´Ð»Ñ ÐºÐ¸ÑайÑкиÑ
иеÑоглиÑов: \p{sc=Han}, и Ñак далее:
let regexp = /\p{sc=Han}/gu; // веÑнÑÑ ÐºÐ¸ÑайÑкие иеÑоглиÑÑ
let str = `Hello ÐÑÐ¸Ð²ÐµÑ ä½ å¥½ 123_456`;
alert( str.match(regexp) ); // ä½ ,好
ÐÑимеÑ: валÑÑа
СимволÑ, обознаÑаÑÑие валÑÑÑ, Ñакие как $, â¬, Â¥, имеÑÑ ÑвойÑÑво \p{Currency_Symbol}, коÑоÑÐºÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ: \p{Sc}.
ÐÑполÑзÑем его, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð¸ÑкаÑÑ ÑÐµÐ½Ñ Ð² ÑоÑмаÑе «валÑÑа, за коÑоÑой идÑÑ ÑиÑÑа»:
let regexp = /\p{Sc}\d/gu;
let str = `ЦенÑ: $2, â¬1, Â¥9`;
alert( str.match(regexp) ); // $2,â¬1,Â¥9
Ðозже, в главе ÐванÑиÑикаÑоÑÑ +, *, ? и {n} Ð¼Ñ Ð¸Ð·ÑÑим, как иÑкаÑÑ ÑиÑла из лÑбого колиÑеÑÑва ÑиÑÑ.
ÐÑого
Флаг u вклÑÑÐ°ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Ð®Ð½Ð¸ÐºÐ¾Ð´Ð° в ÑегÑлÑÑнÑÑ
вÑÑажениÑÑ
.
ÐонкÑеÑно, ÑÑо ознаÑаеÑ, ÑÑо:
- Ð¡Ð¸Ð¼Ð²Ð¾Ð»Ñ Ð¸Ð· 4 Ð±Ð°Ð¹Ñ Ð²Ð¾ÑпÑинимаÑÑÑÑ ÐºÐ°Ðº единое Ñелое, а не как два Ñимвола по 2 байÑа.
- РабоÑÐ°ÐµÑ Ð¿Ð¾Ð¸Ñк по ЮникоднÑм ÑвойÑÑвам
\p{â¦}.
С помоÑÑÑ Ð®Ð½Ð¸ÐºÐ¾Ð´Ð½ÑÑ ÑвойÑÑв Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑкаÑÑ Ñлова на нÑжнÑÑ ÑзÑÐºÐ°Ñ , ÑпеÑиалÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ (кавÑÑки, обознаÑÐµÐ½Ð¸Ñ Ð²Ð°Ð»ÑÑÑ) и Ñак далее.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)