You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 9-regular-expressions/21-regexp-unicode-properties/article.md
+16-16Lines changed: 16 additions & 16 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,13 +1,13 @@
1
1
2
-
# Свойства символов Юникода \p
2
+
# Unicode-свойства символов \p
3
3
4
4
[Юникод](https://ru.wikipedia.org/wiki/Юникод), формат кодировки строк, используемый в JavaScript, имеет множество свойств для разных символов (или, технически, кодовых позиций). Они описывают к какой "категории" относится символ и прочие технические детали.
5
5
6
6
В регулярных выражениях свойства могут быть указаны с помощью `\p{…}`. Для таких регулярных выражений обязательно использовать флаг `'u'`.
7
7
8
-
Например, `\p{Letter}` обозначает букву в любом языке. Также можно использовать запись `\p{L}`, где`L` - это псевдоним `Letter`, существуют короткие записи почти для всех свойств.
8
+
Например, `\p{Letter}` обозначает букву в любом языке. Также можно использовать запись `\p{L}`, так как`L` - это псевдоним `Letter`, существуют короткие записи почти для всех свойств.
9
9
10
-
Ниже представлены основные свойства с псевдонимов:
10
+
Вот основные категории свойств:
11
11
12
12
- Буквы `L`:
13
13
- в нижнем регистре `Ll`, модификатор `Lm`, заглавные буквы `Lt`, в верхнем регистре `Lu`, прочие `Lo`
@@ -22,7 +22,7 @@
22
22
- Разделители `Z`:
23
23
- линия `Zl`, параграф `Zp`, пробел `Zs`
24
24
- Прочие `C`:
25
-
-проверка`Cc`, формат`Cf`, не назначено`Cn`, личное использование `Co`, заменители`Cs`.
25
+
-контрольные`Cc`, форматирование`Cf`, не назначенные`Cn`, для приватного использования `Co`, суррогаты`Cs`.
26
26
27
27
```smart header="Дополнительная информация"
28
28
Хотите узнать, какие символы имеют определенное свойство? Для этого есть инструмент: <http://cldr.unicode.org/unicode-utilities/list-unicodeset>.
@@ -33,21 +33,21 @@
33
33
```
34
34
35
35
Есть и другие категории -- производные, например:
36
-
-`Alphabetic` (`Alpha`), включающая `L`, цифры обозначаемые буквами `Nl` (например римские: Ⅻ), и некоторые другие символы `Other_Alphabetic` (`OAltpa`).
37
-
-`Hex_Digit` включает символы шестнадцатеричный чисел: `0-9`, `a-f`.
38
-
-...Юникод - большой зверь, обладающий множеством свойств.
36
+
-`Alphabetic` (`Alpha`), включающая в себя `L`, плюс "буквенные цифры", обозначаемые буквами `Nl` (например римские цифры: Ⅻ), и некоторые другие символы `Other_Alphabetic` (`OAltpa`).
37
+
-`Hex_Digit` включает символы для шестнадцатеричных чисел: `0-9`, `a-f`.
38
+
...Юникод поддерживает и много других свойств.
39
39
40
-
Например, давайте рассмотрим шестизначные шестнадцатеричные числа:
40
+
Например, давайте поищем шестизначные шестнадцатеричные числа:
41
41
42
42
```js run
43
43
let reg =/\p{Hex_Digit}{6}/u; // флаг 'u' -- обязательный
44
44
45
45
alert("color: #123ABC".match(reg)); // 123ABC
46
46
```
47
47
48
-
Существуют свойства которые необходимо использовать со значением. Например, Юникод "Script" (система написания) может иметь значения Cyrillic (Кириллическая), Greek (Греческая), Arabic (Арабская), Han (Китайская) и так далее, [полный список -- длинный]("https://en.wikipedia.org/wiki/Script_(Unicode)").
48
+
Существуют также свойства со значением. Например в Юникоде есть "Script" (система написания), которая может иметь значения Cyrillic (Кириллическая), Greek (Греческая), Arabic (Арабская), Han (Китайская) и так далее, [полный список -- длинный]("https://en.wikipedia.org/wiki/Script_(Unicode)").
49
49
50
-
Для поиска определенных скриптов, мы должны установить `Script=<value>`, например для поиска кириллических букв: `\p{sc=Cyrillic}`, для китайских иероглифов: `\p{sc=Han}`, и так далее:
50
+
Для поиска символов в нужной системе записи (в нужном "алфавите"), мы должны установить `Script=<value>`, например для поиска кириллических букв: `\p{sc=Cyrillic}`, для китайских иероглифов: `\p{sc=Han}`, и так далее:
51
51
52
52
```js run
53
53
let regexp =/\p{sc=Han}+/gu; // вернет китайские слова
Давайте создадим "универсальное" регулярное выражение для `pattern:\w`, применимое в любом языке программирования. Эта задача имеет стандартное решение во многих языках программирования с регулярными выражениями, поддерживающими Юникод, например, например, Perl.
62
+
Шаблон `pattern:\w` предназначен для поиска "символов для слов" (words), но является всего лишь сокращением для `pattern:[a-zA-Z0-9_]`, так что он не найдет китайские, русские слова и т.п.
63
+
64
+
Давайте сделаем универсальный шаблон, который ищет символы, используемые в словах, для любого языка. Это очень легко с Юникод-свойствами:
Теперь расшифруем, то что получилось. Вспомним, что `pattern:\w` фактически тоже самое, что `pattern:[a-zA-Z0-9_]`.
69
-
70
-
Итак, набор символов включает в себя:
70
+
Теперь расшифруем, то что получилось. По аналогии с классом `pattern:\w`, который является сокращением набора `pattern:[a-zA-Z0-9_]`, мы делаем свой набор, который включает в себя:
71
71
72
72
-`Alphabetic` для букв,
73
73
-`Mark` для акцентов (в Юникоде акценты могут быть представлены разными кодовыми позициями),
74
74
-`Decimal_Number` для цифр,
75
75
-`Connector_Punctuation` для символа `'_'` и подобных ему,
76
-
-`Join_Control` -– два специальных указателя с кодами `200c` и `200d`, используемые в лигатурах, например, арабских.
76
+
-`Join_Control` -– две специальные кодовые позиции с кодами `200c` и `200d`, используемые в лигатурах, например, арабских.
77
77
78
-
И вот что получится, когда мы заменим длинные названия псевдонимами (список псевдонимов [здесь](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