|
1 | 1 |
|
2 | | -# Unicode character properties \p |
| 2 | +# Unicode-свойства символов \p |
3 | 3 |
|
4 | | -[Unicode](https://en.wikipedia.org/wiki/Unicode), the encoding format used by JavaScript strings, has a lot of properties for different characters (or, technically, code points). They describe which "categories" character belongs to, and a variety of technical details. |
| 4 | +[Юникод](https://ru.wikipedia.org/wiki/Юникод), формат кодировки строк, используемый в JavaScript, имеет множество свойств для разных символов (или, технически, кодовых позиций). Они описывают к какой "категории" относится символ и прочие технические детали. |
5 | 5 |
|
6 | | -In regular expressions these can be set by `\p{…}`. And there must be flag `'u'`. |
| 6 | +В регулярных выражениях свойства могут быть указаны с помощью `\p{…}`. Для таких регулярных выражений обязательно использовать флаг `'u'`. |
7 | 7 |
|
8 | | -For instance, `\p{Letter}` denotes a letter in any of language. We can also use `\p{L}`, as `L` is an alias of `Letter`, there are shorter aliases for almost every property. |
| 8 | +Например, `\p{Letter}` обозначает букву в любом языке. Также можно использовать запись `\p{L}`, так как `L` - это псевдоним `Letter`, существуют короткие записи почти для всех свойств. |
9 | 9 |
|
10 | | -Here's the main tree of properties: |
| 10 | +Вот основные категории свойств: |
11 | 11 |
|
12 | | -- Letter `L`: |
13 | | - - lowercase `Ll`, modifier `Lm`, titlecase `Lt`, uppercase `Lu`, other `Lo` |
14 | | -- Number `N`: |
15 | | - - decimal digit `Nd`, letter number `Nl`, other `No`: |
16 | | -- Punctuation `P`: |
17 | | - - connector `Pc`, dash `Pd`, initial quote `Pi`, final quote `Pf`, open `Ps`, close `Pe`, other `Po` |
18 | | -- Mark `M` (accents etc): |
19 | | - - spacing combining `Mc`, enclosing `Me`, non-spacing `Mn` |
20 | | -- Symbol `S`: |
21 | | - - currency `Sc`, modifier `Sk`, math `Sm`, other `So` |
22 | | -- Separator `Z`: |
23 | | - - line `Zl`, paragraph `Zp`, space `Zs` |
24 | | -- Other `C`: |
25 | | - - control `Cc`, format `Cf`, not assigned `Cn`, private use `Co`, surrogate `Cs`. |
| 12 | +- Буквы `L`: |
| 13 | + - в нижнем регистре `Ll`, модификатор `Lm`, заглавные буквы `Lt`, в верхнем регистре `Lu`, прочие `Lo` |
| 14 | +- Число `N`: |
| 15 | + - десятичная цифра `Nd`, цифры обозначаемые буквами (римские) `Nl`, прочие `No`: |
| 16 | +- Знаки препинания `P`: |
| 17 | + - соединители `Pc`, тире `Pd`, открывающие кавычки `Pi`, закрывающие кавычки `Pf`, открывающие скобки `Ps`, закрывающие скобки `Pe`, прочее `Po` |
| 18 | +- Отметки `M` (например, акценты): |
| 19 | + - двоеточия `Mc`, вложения `Me`, апострофы `Mn` |
| 20 | +- Символы `S`: |
| 21 | + - валюты `Sc`, модификаторы `Sk`, математические `Sm`, прочие `So` |
| 22 | +- Разделители `Z`: |
| 23 | + - линия `Zl`, параграф `Zp`, пробел `Zs` |
| 24 | +- Прочие `C`: |
| 25 | + - контрольные `Cc`, форматирование `Cf`, не назначенные `Cn`, для приватного использования `Co`, суррогаты `Cs`. |
26 | 26 |
|
27 | | -```smart header="More information" |
28 | | -Interested to see which characters belong to a property? There's a tool at <http://cldr.unicode.org/unicode-utilities/list-unicodeset> for that. |
| 27 | +```smart header="Дополнительная информация" |
| 28 | +Хотите узнать, какие символы имеют определенное свойство? Для этого есть инструмент: <http://cldr.unicode.org/unicode-utilities/list-unicodeset>. |
29 | 29 |
|
30 | | -You could also explore properties at [Character Property Index](http://unicode.org/cldr/utility/properties.jsp). |
| 30 | +Вы также можете изучить свойства в [каталоге свойств символа](http://unicode.org/cldr/utility/properties.jsp). |
31 | 31 |
|
32 | | -For the full Unicode Character Database in text format (along with all properties), see <https://www.unicode.org/Public/UCD/latest/ucd/>. |
| 32 | +Полная база Юникод-символов в текстовом формате (вместе со всеми свойствами), находится здесь <https://www.unicode.org/Public/UCD/latest/ucd/>. |
33 | 33 | ``` |
34 | 34 |
|
35 | | -There are also other derived categories, like: |
36 | | -- `Alphabetic` (`Alpha`), includes Letters `L`, plus letter numbers `Nl` (e.g. roman numbers Ⅻ), plus some other symbols `Other_Alphabetic` (`OAltpa`). |
37 | | -- `Hex_Digit` includes hexadimal digits: `0-9`, `a-f`. |
38 | | -- ...Unicode is a big beast, it includes a lot of properties. |
| 35 | +Есть и другие категории -- производные, например: |
| 36 | +- `Alphabetic` (`Alpha`), включающая в себя `L`, плюс "буквенные цифры", обозначаемые буквами `Nl` (например римские цифры: Ⅻ), и некоторые другие символы `Other_Alphabetic` (`OAltpa`). |
| 37 | +- `Hex_Digit` включает символы для шестнадцатеричных чисел: `0-9`, `a-f`. |
| 38 | +...Юникод поддерживает и много других свойств. |
39 | 39 |
|
40 | | -For instance, let's look for a 6-digit hex number: |
| 40 | +Например, давайте поищем шестизначные шестнадцатеричные числа: |
41 | 41 |
|
42 | 42 | ```js run |
43 | | -let reg = /\p{Hex_Digit}{6}/u; // flag 'u' is requireds |
| 43 | +let reg = /\p{Hex_Digit}{6}/u; // флаг 'u' -- обязательный |
44 | 44 |
|
45 | 45 | alert("color: #123ABC".match(reg)); // 123ABC |
46 | 46 | ``` |
47 | 47 |
|
48 | | -There are also properties with a value. For instance, Unicode "Script" (a writing system) can be Cyrillic, Greek, Arabic, Han (Chinese) etc, the [list is long]("https://en.wikipedia.org/wiki/Script_(Unicode)"). |
| 48 | +Существуют также свойства со значением. Например в Юникоде есть "Script" (система написания), которая может иметь значения Cyrillic (Кириллическая), Greek (Греческая), Arabic (Арабская), Han (Китайская) и так далее, [полный список -- длинный]("https://en.wikipedia.org/wiki/Script_(Unicode)"). |
49 | 49 |
|
50 | | -To search for certain scripts, we should supply `Script=<value>`, e.g. to search for cyrillic letters: `\p{sc=Cyrillic}`, for Chinese glyphs: `\p{sc=Han}`, etc: |
| 50 | +Для поиска символов в нужной системе записи (в нужном "алфавите"), мы должны установить `Script=<value>`, например для поиска кириллических букв: `\p{sc=Cyrillic}`, для китайских иероглифов: `\p{sc=Han}`, и так далее: |
51 | 51 |
|
52 | 52 | ```js run |
53 | | -let regexp = /\p{sc=Han}+/gu; // get chinese words |
| 53 | +let regexp = /\p{sc=Han}+/gu; // вернет китайские слова |
54 | 54 |
|
55 | 55 | let str = `Hello Привет 你好 123_456`; |
56 | 56 |
|
57 | 57 | alert( str.match(regexp) ); // 你好 |
58 | 58 | ``` |
59 | 59 |
|
60 | | -## Building multi-language \w |
| 60 | +## Создание многоязычного \w |
61 | 61 |
|
62 | | -Let's make a "universal" regexp for `pattern:\w`, for any language. That task has a standard solution in many programming languages with unicode-aware regexps, e.g. Perl. |
| 62 | +Шаблон `pattern:\w` предназначен для поиска "символов для слов" (words), но является всего лишь сокращением для `pattern:[a-zA-Z0-9_]`, так что он не найдет китайские, русские слова и т.п. |
| 63 | + |
| 64 | +Давайте сделаем универсальный шаблон, который ищет символы, используемые в словах, для любого языка. Это очень легко с Юникод-свойствами: |
63 | 65 |
|
64 | 66 | ```js |
65 | 67 | /[\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]/u |
66 | 68 | ``` |
67 | 69 |
|
68 | | -Let's decipher. Remember, `pattern:\w` is actually the same as `pattern:[a-zA-Z0-9_]`. |
69 | | - |
70 | | -So the character set includes: |
| 70 | +Теперь расшифруем, то что получилось. По аналогии с классом `pattern:\w`, который является сокращением набора `pattern:[a-zA-Z0-9_]`, мы делаем свой набор, который включает в себя: |
71 | 71 |
|
72 | | -- `Alphabetic` for letters, |
73 | | -- `Mark` for accents, as in Unicode accents may be represented by separate code points, |
74 | | -- `Decimal_Number` for numbers, |
75 | | -- `Connector_Punctuation` for the `'_'` character and alike, |
76 | | -- `Join_Control` -– two special code points with hex codes `200c` and `200d`, used in ligatures e.g. in arabic. |
| 72 | +- `Alphabetic` для букв, |
| 73 | +- `Mark` для акцентов (в Юникоде акценты могут быть представлены разными кодовыми позициями), |
| 74 | +- `Decimal_Number` для цифр, |
| 75 | +- `Connector_Punctuation` для символа `'_'` и подобных ему, |
| 76 | +- `Join_Control` -– две специальные кодовые позиции с кодами `200c` и `200d`, используемые в лигатурах, например, арабских. |
77 | 77 |
|
78 | | -Or, if we replace long names with aliases (a list of aliases [here](https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt)): |
| 78 | +Или, если заменить длинные названия псевдонимами (список псевдонимов [здесь](https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt)): |
79 | 79 |
|
80 | 80 | ```js run |
81 | 81 | let regexp = /([\p{Alpha}\p{M}\p{Nd}\p{Pc}\p{Join_C}]+)/gu; |
|
0 commit comments