Skip to content

Commit cb1bae7

Browse files
authored
Merge pull request #1653 from Rnbsov/patch-94
👾smth
2 parents d82350d + bdb8452 commit cb1bae7

File tree

4 files changed

+27
-12
lines changed

4 files changed

+27
-12
lines changed

1-js/02-first-steps/05-types/article.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,15 @@ n = 12.345;
4646
alert( "не число" / 2 ); // NaN, такое деление является ошибкой
4747
```
4848

49-
Значение `NaN` "прилипчиво". Любая операция с `NaN` возвращает `NaN`:
49+
Значение `NaN` "прилипчиво". Любая математическая операция с `NaN` возвращает `NaN`:
5050

5151
```js run
52-
alert( "не число" / 2 + 5 ); // NaN
52+
alert( NaN + 1 ); // NaN
53+
alert( 3 * NaN ); // NaN
54+
alert( "не число" / 2 - 1 ); // NaN
5355
```
5456

55-
Если где-то в математическом выражении есть `NaN`, то результатом вычислений с его участием будет `NaN`.
57+
Если где-то в математическом выражении есть `NaN`, то оно распространяется на весь результат (есть только одно исключение: `NaN ** 0` равно `1`).
5658

5759
```smart header="Математические операции -- безопасны"
5860
Математические операции в JavaScript "безопасны". Мы можем делать что угодно: делить на ноль, обращаться с нечисловыми строками как с числами и т.д.
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>` без учета регистра.

9-regular-expressions/14-regexp-lookahead-lookbehind/2-insert-after-head/task.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# Вставьте после фрагмента
22

3-
Есть строка с HTML-документом.
3+
У нас есть строка с HTML-документом.
44

5-
Вставьте после тега `<body>` (у него могут быть атрибуты) строку `<h1>Hello</h1>`.
5+
Напишите регулярное выражение которое вставляет `<h1>Hello</h1>` сразу же после тега `<body>`. У тега могут быть атрибуты.
66

77
Например:
88

@@ -21,6 +21,7 @@ str = str.replace(regexp, `<h1>Hello</h1>`);
2121
```
2222

2323
После этого значение `str`:
24+
2425
```html
2526
<html>
2627
<body style="height: 200px"><h1>Hello</h1>

9-regular-expressions/14-regexp-lookahead-lookbehind/article.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ alert( str.match(/\d+(?!€)/) ); // 2 (в этот раз проигнорир
6363

6464
## Ретроспективная проверка
6565

66+
```warn header="Браузерная совместимость с ретроспективной проверкой"
67+
Обратите внимание: Lookbehind не поддерживается в браузерах построенных не на движке V8, таких как Safari и Internet Explorer.
68+
```
69+
6670
Опережающие проверки позволяют задавать условия на то, что "идёт после".
6771

6872
Ретроспективная проверка выполняет такую же функцию, но с просмотром назад. Другими словами, она находит соответствие шаблону, только если перед ним есть что-то заранее определённое.

0 commit comments

Comments
 (0)