Skip to content

Commit ce07911

Browse files
authored
Update solution.md
1 parent 03ffed6 commit ce07911

File tree

1 file changed

+15
-7
lines changed
  • 9-regular-expressions/14-regexp-lookahead-lookbehind/2-insert-after-head

1 file changed

+15
-7
lines changed
Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11

2-
Для того, чтобы вставить после тега `<body>`, нужно вначале его найти. Будем использовать регулярное выражение `pattern:<body.*?>`.
2+
Для того, чтобы вставить после тега `<body>`, нужно вначале его найти. Мы можем использовать регулярное выражение `pattern:<body.*?>` для этого.
33

4-
Далее, нам нужно оставить сам тег `<body>` на месте и добавить текст после него.
4+
В этом задании нам не нужно изменять `<body>` тег. Нам нужно только добавить текст после него.
5+
6+
Вот как мы можем это сделать:
57

6-
Это можно сделать вот так:
78
```js run
89
let str = '...<body style="...">...';
910
str = str.replace(/<body.*?>/, '$&<h1>Hello</h1>');
1011

1112
alert(str); // ...<body style="..."><h1>Hello</h1>...
1213
```
1314

14-
В строке замены `$&` означает само совпадение, то есть мы заменяем `pattern:<body.*?>` заменяется на самого себя плюс `<h1>Hello</h1>`.
15+
В строке замены `$&` означает само совпадение, то есть мы заменяем ту часть текста которая соответствует `pattern:<body.*?>`. Совпадение заменяется на самого себя плюс `<h1>Hello</h1>`.
1516

1617
Альтернативный вариант - использовать ретроспективную проверку:
1718

@@ -22,8 +23,15 @@ str = str.replace(/(?<=<body.*?>)/, `<h1>Hello</h1>`);
2223
alert(str); // ...<body style="..."><h1>Hello</h1>...
2324
```
2425

25-
Такое регулярное выражение на каждой позиции будет проверять, не идёт ли прямо перед ней `pattern:<body.*?>`. Если да - совпадение найдено. Но сам тег `pattern:<body.*?>` в совпадение не входит, он только участвует в проверке. А других символов после проверки в нём нет, так что текст совпадения будет пустым.
26+
Как вы можете видеть, в этом регулярном выражении есть только ретроспективная часть.
27+
28+
Это работает вот так:
29+
- В каждой позиции текста.
30+
- Проверяет не предшествует ли ему `pattern:<body.*?>`.
31+
- Если это так, то мы встретили совпадение.
32+
33+
Тег `pattern:<body.*>` не вернётся. Результатом этого регулярного выражения является буквально пустая строка, но она совпадает только в позициях, предшествующих `pattern:<body.*>`.
2634

27-
Происходит замена "пустой строки", перед которой идёт `pattern:<body.*?>` на `<h1>Hello</h1>`. Что, как раз, и есть вставка этой строки после `<body>`.
35+
Мы заменяем "пустую строку", которая предшествует `pattern:<body.*?>` на `<h1>Hello</h1>`. Что, как раз, и есть вставка этой строки после `<body>`.
2836

29-
P.S. Этому регулярному выражению не помешают флаги: `pattern:/<body.*?>/si`, чтобы в "точку" входил перевод строки (тег может занимать несколько строк), а также чтобы теги в другом регистре типа `match:<BODY>` тоже находились.
37+
P.S. Флаги регулярных выражений, такие как `pattern:s` и `pattern:i`, также могут быть полезны: `pattern:/<body.*?>/si`. Флаг `pattern:s` создает точечный `pattern:.` соответствует символу новой строки, а флаг `pattern:i` делает `pattern:<body>` также соответствующим `match:<BODY>` без учета регистра.

0 commit comments

Comments
 (0)