Skip to content

Commit dcb3a7b

Browse files
committed
Review changes
1 parent 6d293b7 commit dcb3a7b

1 file changed

Lines changed: 16 additions & 16 deletions

File tree

  • 9-regular-expressions/21-regexp-unicode-properties

9-regular-expressions/21-regexp-unicode-properties/article.md

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11

2-
# Свойства символов Юникода \p
2+
# Unicode-свойства символов \p
33

44
[Юникод](https://ru.wikipedia.org/wiki/Юникод), формат кодировки строк, используемый в JavaScript, имеет множество свойств для разных символов (или, технически, кодовых позиций). Они описывают к какой "категории" относится символ и прочие технические детали.
55

66
В регулярных выражениях свойства могут быть указаны с помощью `\p{…}`. Для таких регулярных выражений обязательно использовать флаг `'u'`.
77

8-
Например, `\p{Letter}` обозначает букву в любом языке. Также можно использовать запись `\p{L}`, где `L` - это псевдоним `Letter`, существуют короткие записи почти для всех свойств.
8+
Например, `\p{Letter}` обозначает букву в любом языке. Также можно использовать запись `\p{L}`, так как `L` - это псевдоним `Letter`, существуют короткие записи почти для всех свойств.
99

10-
Ниже представлены основные свойства с псевдонимов:
10+
Вот основные категории свойств:
1111

1212
- Буквы `L`:
1313
- в нижнем регистре `Ll`, модификатор `Lm`, заглавные буквы `Lt`, в верхнем регистре `Lu`, прочие `Lo`
@@ -22,7 +22,7 @@
2222
- Разделители `Z`:
2323
- линия `Zl`, параграф `Zp`, пробел `Zs`
2424
- Прочие `C`:
25-
- проверка `Cc`, формат `Cf`, не назначено `Cn`, личное использование `Co`, заменители `Cs`.
25+
- контрольные `Cc`, форматирование `Cf`, не назначенные `Cn`, для приватного использования `Co`, суррогаты `Cs`.
2626

2727
```smart header="Дополнительная информация"
2828
Хотите узнать, какие символы имеют определенное свойство? Для этого есть инструмент: <http://cldr.unicode.org/unicode-utilities/list-unicodeset>.
@@ -33,21 +33,21 @@
3333
```
3434

3535
Есть и другие категории -- производные, например:
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+
...Юникод поддерживает и много других свойств.
3939

40-
Например, давайте рассмотрим шестизначные шестнадцатеричные числа:
40+
Например, давайте поищем шестизначные шестнадцатеричные числа:
4141

4242
```js run
4343
let reg = /\p{Hex_Digit}{6}/u; // флаг 'u' -- обязательный
4444

4545
alert("color: #123ABC".match(reg)); // 123ABC
4646
```
4747

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)").
4949

50-
Для поиска определенных скриптов, мы должны установить `Script=<value>`, например для поиска кириллических букв: `\p{sc=Cyrillic}`, для китайских иероглифов: `\p{sc=Han}`, и так далее:
50+
Для поиска символов в нужной системе записи (в нужном "алфавите"), мы должны установить `Script=<value>`, например для поиска кириллических букв: `\p{sc=Cyrillic}`, для китайских иероглифов: `\p{sc=Han}`, и так далее:
5151

5252
```js run
5353
let regexp = /\p{sc=Han}+/gu; // вернет китайские слова
@@ -59,23 +59,23 @@ alert( str.match(regexp) ); // 你好
5959

6060
## Создание многоязычного \w
6161

62-
Давайте создадим "универсальное" регулярное выражение для `pattern:\w`, применимое в любом языке программирования. Эта задача имеет стандартное решение во многих языках программирования с регулярными выражениями, поддерживающими Юникод, например, например, Perl.
62+
Шаблон `pattern:\w` предназначен для поиска "символов для слов" (words), но является всего лишь сокращением для `pattern:[a-zA-Z0-9_]`, так что он не найдет китайские, русские слова и т.п.
63+
64+
Давайте сделаем универсальный шаблон, который ищет символы, используемые в словах, для любого языка. Это очень легко с Юникод-свойствами:
6365

6466
```js
6567
/[\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]/u
6668
```
6769

68-
Теперь расшифруем, то что получилось. Вспомним, что `pattern:\w` фактически тоже самое, что `pattern:[a-zA-Z0-9_]`.
69-
70-
Итак, набор символов включает в себя:
70+
Теперь расшифруем, то что получилось. По аналогии с классом `pattern:\w`, который является сокращением набора `pattern:[a-zA-Z0-9_]`, мы делаем свой набор, который включает в себя:
7171

7272
- `Alphabetic` для букв,
7373
- `Mark` для акцентов (в Юникоде акценты могут быть представлены разными кодовыми позициями),
7474
- `Decimal_Number` для цифр,
7575
- `Connector_Punctuation` для символа `'_'` и подобных ему,
76-
- `Join_Control` -– два специальных указателя с кодами `200c` и `200d`, используемые в лигатурах, например, арабских.
76+
- `Join_Control` -– две специальные кодовые позиции с кодами `200c` и `200d`, используемые в лигатурах, например, арабских.
7777

78-
И вот что получится, когда мы заменим длинные названия псевдонимами (список псевдонимов [здесь](https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt)):
78+
Или, если заменить длинные названия псевдонимами (список псевдонимов [здесь](https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt)):
7979

8080
```js run
8181
let regexp = /([\p{Alpha}\p{M}\p{Nd}\p{Pc}\p{Join_C}]+)/gu;

0 commit comments

Comments
 (0)