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
To grasp the use case of`y` flag, and see how great it is, let's explore a practical use case.
4
+
Давайте рассмотрим пример практического применения флага`y`, чтобы понять насколько он удобен.
5
5
6
-
One of common tasks for regexps is "parsing": when we get a text and analyze it for logical components, build a structure.
6
+
Одна из часто встречающихся задач регулярных выражений -- "парсинг": мы имеем текст и с помощью регулярных выражений разделяем его на логические компоненты, получаем структуру.
7
7
8
-
For instance, there are HTML parsers for browser pages, that turn text into a structured document. There are parsers for programming languages, like JavaScript, etc.
8
+
Например, в браузерах существует HTML-парсер, который превращает текст в структурированный документ. Также существуют парсеры для языков программирования, как JavaScript и любых других.
9
9
10
-
Writing parsers is a special area, with its own tools and algorithms, so we don't go deep in there, but there's a very common question: "What is the text at the given position?".
10
+
Мы не будем погружаться глубоко в тему написания парсеров (это специализированная область со своим набором инструментов и алгоритмов). Но мы постараемся ответить на вопрос: "Что за текст расположен на определенной позиции".
11
11
12
-
For instance, for a programming language variants can be like:
13
-
-Is it a "name"`pattern:\w+`?
14
-
-Or is it a number`pattern:\d+`?
15
-
-Or an operator`pattern:[+-/*]`?
16
-
- (a syntax error if it's not anything in the expected list)
12
+
Например, для языка программирования варианты могут быть следующие:
13
+
-Это название переменной или функции`pattern:\w+`?
14
+
-Или число`pattern:\d+`?
15
+
-Или оператор`pattern:[+-/*]`?
16
+
- (Или же это синтаксическая ошибка, если не попадает ни под один из ожидаемых вариантов)
17
17
18
-
In JavaScript, to perform a search starting from a given position, we can use `regexp.exec`with `regexp.lastIndex` property, but that's not what we need!
18
+
В JavaScript для поиска с определенной позиции текста может быть использован метод `regexp.exec`с определенным свойством `regexp.lastIndex`, но это не то что мы ищем!
19
19
20
-
We'd like to check the match exactly at given position, not "starting" from it.
20
+
Мы хотим проверять текст именно в той позиции, которую мы указали, а не "начиная" с неё.
21
21
22
-
Here's a (failing) attempt to use`lastIndex`:
22
+
В примере показано (ошибочное) использование`lastIndex`:
23
23
24
24
```js run
25
25
let str ="(text before) function ...";
26
26
27
-
//attempting to find function at position 5:
28
-
let regexp =/function/g; //must use "g" flag, otherwise lastIndex is ignored
27
+
//попробуем найти слово function на позиции 5:
28
+
let regexp =/function/g; //необходимо использовать флаг "g", в противном случае свойство lastIndex будет проигнорировано
29
29
regexp.lastIndex=5
30
30
31
31
alert (regexp.exec(str)); // function
32
32
```
33
33
34
-
The match is found, because `regexp.exec`starts to search from the given position and goes on by the text, successfully matching "function" later.
34
+
Регулярное выражение находит совпадение, потому что метод `regexp.exec`начинает искать с указанной позиции и продвигается дальше по тексту и находит совпадение в слове "function".
35
35
36
-
We could work around that by checking if "`regexp.exec(str).index`property is `5`, and if not, ignore the much. But the main problem here is performance.
36
+
Чтобы узнать, находится ли совпадение в нужном месте можно использовать свойство `regexp.exec(str).index`и проверить равно ли оно `5`, если нет, тогда игнорировать результат. Такое решение -- рабочее, но оно имеет проблему производительности.
37
37
38
-
The regexp engine does a lot of unnecessary work by scanning at further positions. The delays are clearly noticeable if the text is long, because there are many such searches in a parser.
38
+
Алгоритм проверки регулярного выражение сделает ненужную работу по проверки текста после указанного значения. Если текст достаточно длинный, могут появится задержки, потому что в парсере таких поисков много.
39
39
40
-
## The "y" flag
40
+
## Флаг "y"
41
41
42
-
So we've came to the problem: how to search for a match, starting exactly at the given position.
42
+
Итак, мы пришли к проблеме: как проверить на совпадение, именно в указанной позиции.
43
43
44
-
That's what`y` flag does. It makes the regexp search only at the `lastIndex` position.
44
+
Ответ: флаг`y`, который создан именно для этого. С ним поиск производиться только в позиции указанной в свойстве `lastIndex`.
45
45
46
-
Here's an example
46
+
Пример:
47
47
48
48
```js run
49
49
let str ="(text before) function ...";
@@ -53,19 +53,19 @@ let regexp = /function/y;
53
53
regexp.lastIndex=5;
54
54
*/!*
55
55
56
-
alert (regexp.exec(str)); // null (no match, unlike "g" flag!)
56
+
alert (regexp.exec(str)); // null (совпадение не найдено, в отличии от флага "g"!)
57
57
58
58
*!*
59
59
regexp.lastIndex=14;
60
60
*/!*
61
61
62
-
alert (regexp.exec(str)); // function (match!)
62
+
alert (regexp.exec(str)); // function (совпадение!)
63
63
```
64
64
65
-
As we can see, now the regexp is only matched at the given position.
65
+
Как мы видим, теперь регулярное выражение проверяет на совпадение только в указанной позиции.
66
66
67
-
So what `y`does is truly unique, and very important for writing parsers.
67
+
Именно это делает флаг `y`уникальным, и очень важным при написании парсера.
68
68
69
-
The`y`flag allows to apply a regular expression (or many of them one-by-one) exactly at the given position and when we understand what's there, we can move on -- step by step examining the text.
69
+
Флаг`y` позволяет выполнять регулярное выражение (или несколько, одно за другим) именно в указанной позиции и двигаться дальше, после того как парсер определит, что именно находится в этой позиции -- шаг за шагом исследуя текст.
70
70
71
-
Without the flag the regexp engine always searches till the end of the text, that takes time, especially if the text is large. So our parser would be very slow. The`y`flag is exactly the right thing here.
71
+
Без этого флага регулярное выражение будет выполнять поиск до конца текста, что будет занимать время, особенно, если текст большой. Таким образом парсер будет очень медленным. Флаг`y`именно то, что нужно.
0 commit comments