|
1 | 1 |
|
2 | | -# Escaping, special characters |
| 2 | +# Экранирование, специальные символы |
3 | 3 |
|
4 | | -As we've seen, a backslash `"\"` is used to denote character classes. So it's a special character in regexps (just like in a regular string). |
| 4 | +Как мы уже видели, обратная косая черта `"\"` используется для обозначения классов символов. Это специальный символ в регулярных выражениях (как и в обычных строках). |
5 | 5 |
|
6 | | -There are other special characters as well, that have special meaning in a regexp. They are used to do more powerful searches. Here's a full list of them: `pattern:[ \ ^ $ . | ? * + ( )`. |
| 6 | +Есть и другие специальные символы, которые имеют особое значение в регулярном выражении. Они используются для более сложных поисковых конструкций. Вот полный перечень этих символов: `pattern:[ \ ^ $ . | ? * + ( )`. |
7 | 7 |
|
8 | | -Don't try to remember the list -- soon we'll deal with each of them separately and you'll know them by heart automatically. |
| 8 | +Не надо пытаться запомнить этот список -- скоро мы разберемся с каждым из них по отдельности, и таким образом вы выучите их "автоматически". |
9 | 9 |
|
10 | | -## Escaping |
| 10 | +## Экранирование символов |
11 | 11 |
|
12 | | -Let's say we want to find a dot literally. Not "any character", but just a dot. |
| 12 | +Допустим, мы хотим найти буквально точку. Не "любой символ", а именно точку. |
13 | 13 |
|
14 | | -To use a special character as a regular one, prepend it with a backslash: `pattern:\.`. |
| 14 | +Чтобы использовать специальный символ как обычный, добавьте к нему обратную косую черту: `pattern:\.`. |
15 | 15 |
|
16 | | -That's also called "escaping a character". |
| 16 | +Это называется "экранирование символа". |
17 | 17 |
|
18 | | -For example: |
| 18 | +К примеру: |
19 | 19 | ```js run |
20 | | -alert( "Chapter 5.1".match(/\d\.\d/) ); // 5.1 (match!) |
21 | | -alert( "Chapter 511".match(/\d\.\d/) ); // null (looking for a real dot \.) |
| 20 | +alert( "Глава 5.1".match(/\d\.\d/) ); // 5.1 (совпадение!) |
| 21 | +alert( "Глава 511".match(/\d\.\d/) ); // null ("\." - ищет обычную точку) |
22 | 22 | ``` |
23 | 23 |
|
24 | | -Parentheses are also special characters, so if we want them, we should use `pattern:\(`. The example below looks for a string `"g()"`: |
| 24 | +Круглые скобки также являются специальными символами, поэтому, если нам нужно использовать именно их, нужно указать `pattern:\(`. В приведенном ниже примере ищется строка `"g()"`: |
25 | 25 |
|
26 | 26 | ```js run |
27 | 27 | alert( "function g()".match(/g\(\)/) ); // "g()" |
28 | 28 | ``` |
29 | 29 |
|
30 | | -If we're looking for a backslash `\`, it's a special character in both regular strings and regexps, so we should double it. |
| 30 | +Если мы ищем обратную косую черту `\`, это специальный символ как в обычных строках, так и в регулярных выражениях, поэтому мы должны удвоить её. |
31 | 31 |
|
32 | 32 | ```js run |
33 | 33 | alert( "1\\2".match(/\\/) ); // '\' |
34 | 34 | ``` |
35 | 35 |
|
36 | | -## A slash |
| 36 | +## Косая черта |
37 | 37 |
|
38 | | -A slash symbol `'/'` is not a special character, but in JavaScript it is used to open and close the regexp: `pattern:/...pattern.../`, so we should escape it too. |
| 38 | +Символ косой черты `'/'` не является специальным символом, но в JavaScript он используется для открытия и закрытия регулярного выражения: `pattern:/...pattern.../`, поэтому мы должны экранировать его. |
39 | 39 |
|
40 | | -Here's what a search for a slash `'/'` looks like: |
| 40 | +Вот как выглядит поиск самой косой черты `'/'`: |
41 | 41 |
|
42 | 42 | ```js run |
43 | 43 | alert( "/".match(/\//) ); // '/' |
44 | 44 | ``` |
45 | 45 |
|
46 | | -On the other hand, if we're not using `/.../`, but create a regexp using `new RegExp`, then we don't need to escape it: |
| 46 | +С другой стороны, если мы не используем короткую запись `/.../`, а создаем регулярное выражение, используя `new RegExp`, тогда нам не нужно экранировать косую черту: |
47 | 47 |
|
48 | 48 | ```js run |
49 | 49 | alert( "/".match(new RegExp("/")) ); // '/' |
50 | | -``` |
| 50 | +``` |
51 | 51 |
|
52 | 52 | ## new RegExp |
53 | 53 |
|
54 | | -If we are creating a regular expression with `new RegExp`, then we don't have to escape `/`, but need to do some other escaping. |
| 54 | +Если мы создаем регулярное выражение с помощью `new RegExp`, то нам не нужно учитывать `/`, но нужно дополнительное экранирование. |
55 | 55 |
|
56 | | -For instance, consider this: |
| 56 | +Рассмотрим такой пример: |
57 | 57 |
|
58 | 58 | ```js run |
59 | 59 | let reg = new RegExp("\d\.\d"); |
60 | 60 |
|
61 | | -alert( "Chapter 5.1".match(reg) ); // null |
| 61 | +alert( "Глава 5.1".match(reg) ); // null |
62 | 62 | ``` |
63 | 63 |
|
64 | | -It worked with `pattern:/\d\.\d/`, but with `new RegExp("\d\.\d")` it doesn't, why? |
| 64 | +Поиск работает с `pattern:/\d\.\d/`, но не работает с `new RegExp("\d\.\d")`, почему? |
65 | 65 |
|
66 | | -The reason is that backslashes are "consumed" by a string. Remember, regular strings have their own special characters like `\n`, and a backslash is used for escaping. |
| 66 | +Причина в том, что символы обратной косой черты "съедаются" строкой. Как вы помните, что обычные строки имеют свои специальные символы, такие как `\n`, и для экранирования используется обратная косая черта. |
67 | 67 |
|
68 | | -Please, take a look, what "\d\.\d" really is: |
| 68 | +Вот как воспринимается строка "\d\.\d": |
69 | 69 |
|
70 | 70 | ```js run |
71 | 71 | alert("\d\.\d"); // d.d |
72 | 72 | ``` |
73 | 73 |
|
74 | | -The quotes "consume" backslashes and interpret them, for instance: |
| 74 | +Кавычки "съедают" символы обратной косой черты для себя, например: |
75 | 75 |
|
76 | | -- `\n` -- becomes a newline character, |
77 | | -- `\u1234` -- becomes the Unicode character with such code, |
78 | | -- ...And when there's no special meaning: like `\d` or `\z`, then the backslash is simply removed. |
| 76 | +- `\n` -- становится символом перевода строки, |
| 77 | +- `\u1234` -- становится символом Юникода с указанным номером, |
| 78 | +- ...А когда нет особого значения: как например для `\d` или`\z`, обратная косая черта просто удаляется. |
79 | 79 |
|
80 | | -So the call to `new RegExp` gets a string without backslashes. That's why it doesn't work! |
| 80 | +Таким образом, вызов `new RegExp` получает строку без обратной косой черты. Вот почему поиск не работает! |
81 | 81 |
|
82 | | -To fix it, we need to double backslashes, because quotes turn `\\` into `\`: |
| 82 | +Чтобы исправить это, нам нужно удвоить обратную косую черту, потому что кавычки превращают `\\` в `\`: |
83 | 83 |
|
84 | 84 | ```js run |
85 | 85 | *!* |
86 | 86 | let regStr = "\\d\\.\\d"; |
87 | 87 | */!* |
88 | | -alert(regStr); // \d\.\d (correct now) |
| 88 | +alert(regStr); // \d\.\d (теперь правильно) |
89 | 89 |
|
90 | 90 | let reg = new RegExp(regStr); |
91 | 91 |
|
92 | | -alert( "Chapter 5.1".match(reg) ); // 5.1 |
| 92 | +alert( "Глава 5.1".match(reg) ); // 5.1 |
93 | 93 | ``` |
94 | 94 |
|
95 | | -## Summary |
| 95 | +## Итого |
96 | 96 |
|
97 | | -- To search special characters `pattern:[ \ ^ $ . | ? * + ( )` literally, we need to prepend them with `\` ("escape them"). |
98 | | -- We also need to escape `/` if we're inside `pattern:/.../` (but not inside `new RegExp`). |
99 | | -- When passing a string `new RegExp`, we need to double backslashes `\\`, cause strings consume one of them. |
| 97 | +- Для поиска специальных символов `pattern:[ \ ^ $ . | ? * + ( )` в буквальном смысле, нам нужно добавить перед ними `\` ("экранировать их"). |
| 98 | +- Нам также нужно экранировать `/`, если мы используем `pattern:/.../` (но не `new RegExp`). |
| 99 | +- При передаче строки в `new RegExp` нужно удвоить обратную косую черту `\\` для экранирования специальных символов, потому что строки будут использовать одну из них для своих целей. |
0 commit comments