Skip to content

Commit 2eb9bd7

Browse files
committed
translate 9-regular-expressions/22-regexp-sticky
1 parent f8c0c9e commit 2eb9bd7

1 file changed

Lines changed: 28 additions & 28 deletions

File tree

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

2-
# Sticky flag "y", searching at position
2+
# Липкий флаг "y", поиск в позиции
33

4-
To grasp the use case of `y` flag, and see how great it is, let's explore a practical use case.
4+
Давайте рассмотрим пример практического применения флага `y`, чтобы понять насколько он удобен.
55

6-
One of common tasks for regexps is "parsing": when we get a text and analyze it for logical components, build a structure.
6+
Одна из часто встречающихся задач регулярных выражений -- "парсинг": мы имеем текст и с помощью регулярных выражений разделяем его на логические компоненты, получаем структуру.
77

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 и любых других.
99

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+
Мы не будем погружаться глубоко в тему написания парсеров (это специализированная область со своим набором инструментов и алгоритмов). Но мы постараемся ответить на вопрос: "Что за текст расположен на определенной позиции".
1111

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+
- (Или же это синтаксическая ошибка, если не попадает ни под один из ожидаемых вариантов)
1717

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`, но это не то что мы ищем!
1919

20-
We'd like to check the match exactly at given position, not "starting" from it.
20+
Мы хотим проверять текст именно в той позиции, которую мы указали, а не "начиная" с неё.
2121

22-
Here's a (failing) attempt to use `lastIndex`:
22+
В примере показано (ошибочное) использование `lastIndex`:
2323

2424
```js run
2525
let str = "(text before) function ...";
2626

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 будет проигнорировано
2929
regexp.lastIndex = 5
3030

3131
alert (regexp.exec(str)); // function
3232
```
3333

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".
3535

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`, если нет, тогда игнорировать результат. Такое решение -- рабочее, но оно имеет проблему производительности.
3737

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+
Алгоритм проверки регулярного выражение сделает ненужную работу по проверки текста после указанного значения. Если текст достаточно длинный, могут появится задержки, потому что в парсере таких поисков много.
3939

40-
## The "y" flag
40+
## Флаг "y"
4141

42-
So we've came to the problem: how to search for a match, starting exactly at the given position.
42+
Итак, мы пришли к проблеме: как проверить на совпадение, именно в указанной позиции.
4343

44-
That's what `y` flag does. It makes the regexp search only at the `lastIndex` position.
44+
Ответ: флаг `y`, который создан именно для этого. С ним поиск производиться только в позиции указанной в свойстве `lastIndex`.
4545

46-
Here's an example
46+
Пример:
4747

4848
```js run
4949
let str = "(text before) function ...";
@@ -53,19 +53,19 @@ let regexp = /function/y;
5353
regexp.lastIndex = 5;
5454
*/!*
5555

56-
alert (regexp.exec(str)); // null (no match, unlike "g" flag!)
56+
alert (regexp.exec(str)); // null (совпадение не найдено, в отличии от флага "g"!)
5757

5858
*!*
5959
regexp.lastIndex = 14;
6060
*/!*
6161

62-
alert (regexp.exec(str)); // function (match!)
62+
alert (regexp.exec(str)); // function (совпадение!)
6363
```
6464

65-
As we can see, now the regexp is only matched at the given position.
65+
Как мы видим, теперь регулярное выражение проверяет на совпадение только в указанной позиции.
6666

67-
So what `y` does is truly unique, and very important for writing parsers.
67+
Именно это делает флаг `y` уникальным, и очень важным при написании парсера.
6868

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` позволяет выполнять регулярное выражение (или несколько, одно за другим) именно в указанной позиции и двигаться дальше, после того как парсер определит, что именно находится в этой позиции -- шаг за шагом исследуя текст.
7070

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

Comments
 (0)