Skip to content

Commit 7e9f49e

Browse files
authored
Update article.md
1 parent e4dc2dc commit 7e9f49e

1 file changed

Lines changed: 27 additions & 27 deletions

File tree

9-regular-expressions/09-regexp-groups/article.md

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@
55
У такого выделения есть два эффекта:
66

77
1. Позволяет поместить часть совпадения в отдельный массив.
8-
2. Если установить квантификтор после скобок, то он будет применяться к всему содержимому скобки, а не к одному символу.
8+
2. Если установить квантификтор после скобок, то он будет применяться ко всему содержимому скобки, а не к одному символу.
99

1010
## Пример
1111

12-
В примере ниже шаблон `pattern:(go)+` один или более `match:'go'`:
12+
В примере ниже шаблон `pattern:(go)+` ищет как минимум одно совпадение с `match:'go'`:
1313

1414
```js run
1515
alert( 'Gogogo now!'.match(/(go)+/i) ); // "Gogogo"
1616
```
1717

18-
Без скобок, шаблон `pattern:/go+/` означает `subject:g` и, идущий после него, `subject:o`, который повторяется один или более раз. Например, `match:goooo` или `match:gooooooooo`.
18+
Без скобок, шаблон `pattern:/go+/` означает символ `subject:g` и идущий после него символ `subject:o`, который повторяется один или более раз. Например, `match:goooo` или `match:gooooooooo`.
1919

20-
Скобки группирую символы в слово `pattern:(go)`.
20+
Скобки группируют символы в слово `pattern:(go)`.
2121

2222
Сделаем что-то более сложное -- регулярное выражение, которое соответствует адресу электронной почты.
2323

@@ -31,11 +31,11 @@ john.smith@site.com.uk
3131
Шаблон: `pattern:[-.\w]+@([\w-]+\.)+[\w-]{2,20}`.
3232

3333
1. Первая часть `pattern:[-.\w]+` (перед `@`) может включать любые числовые или буквенные символы, точку и тире, чтобы соответствовать `match:john.smith`.
34-
2. Затем идет `pattern:@` и домен. Это может быть поддомен (например, `host.site.com.uk`), поэтому мы сопоставляем его как слово, за которым следует точка `pattern:([\w-]+\.)` (повторяется). Затем в конце должно быть слово: `match:com` или `match:uk` (но не очень длинное: 2-20 символов).
34+
2. Затем идёт `pattern:@` и домен. Это может быть поддомен (например, `host.site.com.uk`), поэтому мы сопоставляем его как слово, за которым следует точка `pattern:([\w-]+\.)` (повторяется). Затем в конце должно быть слово: `match:com` или `match:uk` (но не очень длинное: 2-20 символов).
3535

36-
Это выражение не идеально, но достаточно хорошее для исправления ошибок и опечаток.
36+
Это выражение не идеальное, но достаточно хорошее для исправления ошибок и опечаток.
3737

38-
Например, мы можем найти все электронные адреса в строке:
38+
Например, мы можем найти все электронные адреса в строке:
3939

4040
```js run
4141
let reg = /[-.\w]+@([\w-]+\.)+[\w-]{2,20}/g;
@@ -47,13 +47,13 @@ alert("my@mail.com @ his@site.com.uk".match(reg)); // my@mail.com, his@site.com.
4747

4848
## Содержимое скобок
4949

50-
Группы скобок нумируются слева направо. Поисковый движок запоминает содержимое в каждой группе и позволяет ссылаться на него в шаблоне регулярного выражения или строке для замены.
50+
Группы скобок нумеруются слева направо. Поисковый движок запоминает содержимое в каждой группе и позволяет ссылаться на него в шаблоне регулярного выражения или строке для замены.
5151

52-
Например, мы хотим найти HTML теги `pattern:<.*?>` и обрадотать их.
52+
Например, мы хотим найти HTML теги `pattern:<.*?>` и обработать их.
5353

5454
Давайте заключим внутреннее содержимое в круглые скобки: `pattern:<(.*?)>`.
5555

56-
Соберем их в массив:
56+
Соберём их в массив:
5757

5858
```js run
5959
let str = '<h1>Hello, world!</h1>';
@@ -62,9 +62,9 @@ let reg = /<(.*?)>/;
6262
alert( str.match(reg) ); // Array: ["<h1>", "h1"]
6363
```
6464

65-
Вызов [String#match](mdn:js/String/match) возвращает группы только если регулярное выражение не имеет флаг `pattern:/.../g`.
65+
Вызов [String#match](mdn:js/String/match) возвращает группы, только если регулярное выражение не имеет флага `pattern:/.../g`.
6666

67-
Если необходимы все совпадения с их группировкой, то мы можем использовать `.matchAll` или `regexp.exec` как описано в <info:regexp-methods>:
67+
Если необходимы все совпадения с их группировкой, то мы можем использовать `.matchAll` или `regexp.exec`, как описано в <info:regexp-methods>:
6868

6969
```js run
7070
let str = '<h1>Hello, world!</h1>';
@@ -78,7 +78,7 @@ alert(matches[0]); // Array: ["<h1>", "h1"]
7878
alert(matches[1]); // Array: ["</h1>", "/h1"]
7979
```
8080

81-
Здесь мы имеем два совпадения для `pattern:<(.*?)>`. Каждый из них является массивом с полным совдаением и группой.
81+
Здесь мы имеем два совпадения для `pattern:<(.*?)>`. Каждое из них является массивом с полным совпадением и группами.
8282

8383
## Вложенные группы
8484

@@ -88,7 +88,7 @@ alert(matches[1]); // Array: ["</h1>", "/h1"]
8888

8989
1. Содержимое тега целиком: `match:span class="my"`.
9090
2. Название тега: `match:span`.
91-
3. Аттрибуты тега: `match:class="my"`.
91+
3. Атрибуты тега: `match:class="my"`.
9292

9393
Давайте добавим скобки для них:
9494

@@ -105,17 +105,17 @@ alert(result); // <span class="my">, span class="my", span, class="my"
105105

106106
![](regexp-nested-groups.png)
107107

108-
С нулевым индексом `result` всегда идет совпадение полностью.
108+
По нулевому индексу в `result` всегда идёт полное совпадение.
109109

110-
Затем группы, нумеруемые слева направо. Та, которая открывается первой, получает первую группу `result[1]`. Она заключает в себе все содержимое тега.
110+
Затем следуют группы, нумеруемые слева направо. Группа, которая идёт первой, получает первый индекс в результате -- `result[1]`. Там находится всё содержимое тега.
111111

112-
Затем в `result[2]` идет группа от второй открывающей скобки `pattern:(` до соответствующей `pattern:)` -- имя тега, тогда мы группируем не пространства, а группу аттрибутов для `result[3]`.
112+
Затем в `result[2]` идёт группа, образованная второй открывающей скобкой `pattern:(` до следующей закрывающей скобки `pattern:)` -- имя тега, далее в `result[3]` мы группируем не пробелы, а атрибуты.
113113

114114
**Даже если скобочная группа необязательна и не входит в совпадение, соответствующий элемент массива `result` существует (и равен `undefined`).**
115115

116-
Например, рассмотрим регэксп `pattern:a(z)?(c)?`. Он ищет `"a"`, за которой не обязательно идёт буква `"z"`, за которой не обязательно идёт буква `"c"`.
116+
Например, рассмотрим регулярное выражение `pattern:a(z)?(c)?`. Оно ищет букву `"a"`, за которой опционально идёт буква `"z"`, за которой, в свою очередь, опционально идёт буква `"c"`.
117117

118-
Если запустить его на строку из одной буквы `subject:a`, то результат будет таков:
118+
Если применить его к строке из одной буквы `subject:a`, то результат будет такой:
119119

120120
```js run
121121
let match = 'a'.match(/a(z)?(c)?/);
@@ -139,11 +139,11 @@ alert( match[1] ); // undefined, потому что для (z)? ничего н
139139
alert( match[2] ); // c
140140
```
141141

142-
Длинна массива всегда: `3`. Для группы `pattern:(z)?` ничего нет, поэтому результат `["ac", undefined, "c"]`.
142+
Длинна массива всегда равна `3`. Для группы `pattern:(z)?` ничего нет, поэтому результат `["ac", undefined, "c"]`.
143143

144144
## Именованные группы
145145

146-
Запоминать группы по числам сложно. Для простых шаблонов это допустимо, но в более сложных случаях мы можем дать имена скобкам.
146+
Запоминать группы по числам сложно. Для простых шаблонов это допустимо, но в более сложных случаях мы можем давать имена скобкам.
147147

148148
Это делается добавлением `pattern:?<name>` непосредственно после открытия скобки. Например:
149149

@@ -162,7 +162,7 @@ alert(groups.day); // 30
162162

163163
Как вы можете видеть, группы располагаются в свойстве `.groups` совпадения.
164164

165-
МЫ также можем использовать их для замены, как `pattern:$<name>` (как в случае с `$1..9`, но использовать имя вместо цифры).
165+
Мы также можем использовать их для замены, как `pattern:$<name>` (как в случае с `$1..9`, но использовать имя вместо цифры).
166166

167167
Например, давайте переделаем информацию о дате `day.month.year`:
168168

@@ -191,9 +191,9 @@ let rearranged = str.replace(dateRegexp,
191191
alert(rearranged); // 30.04.2019
192192
```
193193

194-
Обычно, когдам мы планируем использовать именованные группы, то нам не нужны позиционированные аргументы функции. Для большинства реальных случаев нам нужны только `str` и` groups`.
194+
Обычно, когда мы планируем использовать именованные группы, то из всех аргументов функции нам нужны только `str` и` groups`.
195195

196-
Таким образом, мы можем написать это немного короче:
196+
Таким образом, мы можем переписать код:
197197

198198
```js
199199
let rearranged = str.replace(dateRegexp, (str, ...args) => {
@@ -208,13 +208,13 @@ let rearranged = str.replace(dateRegexp, (str, ...args) => {
208208

209209
## Исключение из запоминания через ?:
210210

211-
Бывает так, что скобки нужны, чтобы квантификатор правильно применился, но мы не хотим содержимое в результате.
211+
Бывает так, что скобки нужны, чтобы квантификатор правильно применился, но мы не хотим, чтобы их содержимое попало в результат.
212212

213213
Скобочную группу можно исключить из запоминаемых и нумеруемых, добавив в её начало `pattern:?:`.
214214

215215
Например, если мы хотим найти `pattern:(go)+`, но не хотим запоминать содержимое (`go`) в отдельный элемент массива, то можем написать так: `pattern:(?:go)+`.
216216

217-
В примере ниже мы получаем только имя "John", как отдельный член массива `results`:
217+
В примере ниже мы получаем только имя "John" как отдельный член массива `results`:
218218

219219
```js run
220220
let str = "Gogo John!";
@@ -234,4 +234,4 @@ alert( result[1] ); // John
234234
- Скобки могут:
235235
- запоминать `(...)`, нумеровать слева направо, давать доступ по номеру.
236236
- именовать группы `(?<name>...)`, давать доступ по имени.
237-
- исключать из запоминания `(?:...)`, использоваться только для применения квантификатора ко всем группам.
237+
- исключать из запоминания `(?:...)`, использоваться только для применения квантификатора ко всей группе символов.

0 commit comments

Comments
 (0)