|
1 | | -# String start ^ and finish $ |
| 1 | +# Начало строки ^ и конец $ |
2 | 2 |
|
3 | | -The caret `pattern:'^'` and dollar `pattern:'$'` characters have special meaning in a regexp. They are called "anchors". |
| 3 | +У символов каретки `pattern:'^'` и доллара `pattern:'$'` есть специальные значения в регулярных выражениях (regexp – англ.). Они называются "якоря" (anchors – англ.). |
4 | 4 |
|
5 | | -The caret `pattern:^` matches at the beginning of the text, and the dollar `pattern:$` -- in the end. |
6 | 5 |
|
7 | | -For instance, let's test if the text starts with `Mary`: |
| 6 | +Каретка `pattern:^` означает совпадение с началом текста, а доллар `pattern:$` - с концом. |
| 7 | + |
| 8 | +К примеру, давайте проверим начинается ли текст с `Mary`: |
8 | 9 |
|
9 | 10 | ```js run |
10 | 11 | let str1 = "Mary had a little lamb, it's fleece was white as snow"; |
11 | | -let str2 = 'Everywhere Mary went, the lamp was sure to go'; |
| 12 | +let str2 = "Everywhere Mary went, the lamp was sure to go"; |
12 | 13 |
|
13 | | -alert( /^Mary/.test(str1) ); // true |
14 | | -alert( /^Mary/.test(str2) ); // false |
| 14 | +alert(/^Mary/.test(str1)); // true |
| 15 | +alert(/^Mary/.test(str2)); // false |
15 | 16 | ``` |
16 | 17 |
|
17 | | -The pattern `pattern:^Mary` means: "the string start and then Mary". |
| 18 | +Шаблон (pattern – англ.) `pattern:^Mary` означает: "строка начинается, затем идет Mary". |
18 | 19 |
|
19 | | -Now let's test whether the text ends with an email. |
| 20 | +Теперь, давайте проверим заканчивается ли текст email-ом. |
20 | 21 |
|
21 | | -To match an email, we can use a regexp `pattern:[-.\w]+@([\w-]+\.)+[\w-]{2,20}`. |
| 22 | +Чтобы найти email, мы используем регулярное выражение `pattern:[-.\w]+@([\w-]+\.)+[\w-]{2,20}`. |
22 | 23 |
|
23 | | -To test whether the string ends with the email, let's add `pattern:$` to the pattern: |
| 24 | +Чтобы проверить заканчивается ли строка email-ом, давайте добавим `pattern:$` в наш шаблон. |
24 | 25 |
|
25 | 26 | ```js run |
26 | 27 | let reg = /[-.\w]+@([\w-]+\.)+[\w-]{2,20}$/g; |
27 | 28 |
|
28 | | -let str1 = 'My email is mail@site.com'; |
29 | | -let str2 = 'Everywhere Mary went, the lamp was sure to go'; |
| 29 | +let str1 = "My email is mail@site.com"; |
| 30 | +let str2 = "Everywhere Mary went, the lamp was sure to go"; |
30 | 31 |
|
31 | | -alert( reg.test(str1) ); // true |
32 | | -alert( reg.test(str2) ); // false |
| 32 | +alert(reg.test(str1)); // true |
| 33 | +alert(reg.test(str2)); // false |
33 | 34 | ``` |
34 | 35 |
|
35 | | -We can use both anchors together to check whether the string exactly follows the pattern. That's often used for validation. |
| 36 | +Мы можем использовать оба якоря вместе, чтобы проверить совпадает ли строка полностью с шаблоном. Это обычно используется для валидации. |
| 37 | + |
| 38 | +К примеру, мы хотим проверить что `str` это цвет в виде `#` и 6 цифр в шестнадцатеричной системе. Шаблоном для такой записи цвета будет `pattern:#[0-9a-f]{6}` |
36 | 39 |
|
37 | | -For instance we want to check that `str` is exactly a color in the form `#` plus 6 hex digits. The pattern for the color is `pattern:#[0-9a-f]{6}`. |
| 40 | +Чтобы проверить, что _вся строка_ точно подходит, мы добавим `pattern:^...$`: |
38 | 41 |
|
39 | | -To check that the *whole string* exactly matches it, we add `pattern:^...$`: |
40 | 42 |
|
41 | 43 | ```js run |
42 | 44 | let str = "#abcdef"; |
43 | 45 |
|
44 | | -alert( /^#[0-9a-f]{6}$/i.test(str) ); // true |
| 46 | +alert(/^#[0-9a-f]{6}$/i.test(str)); // true |
45 | 47 | ``` |
46 | 48 |
|
47 | | -The regexp engine looks for the text start, then the color, and then immediately the text end. Just what we need. |
| 49 | +Движок регулярных выражений будет искать начало текста, потом цвет, и затем сразу конец текста. То что нам и нужно. |
48 | 50 |
|
49 | | -```smart header="Anchors have zero length" |
50 | | -Anchors just like `\b` are tests. They have zero-width. |
| 51 | +```smart header="У якорей нулевая длина" |
| 52 | +Якоря, так же как и `\b` - проверки. У них нулевая ширина. |
51 | 53 |
|
52 | | -In other words, they do not match a character, but rather force the regexp engine to check the condition (text start/end). |
| 54 | +Другими словами, они не совпадают с символами, но заставляют движок регулярных выражений проверять условия (начало/конец текста). |
53 | 55 | ``` |
54 | 56 |
|
55 | | -The behavior of anchors changes if there's a flag `pattern:m` (multiline mode). We'll explore it in the next chapter. |
| 57 | +Поведения якорей меняется если присутствует флаг `pattern:m` (многострочный режим). Мы узнаем об этом больше в следующей главе. |
| 58 | + |
| 59 | +<!-- |
| 60 | +
|
| 61 | +Начало строки ^ и конец $ |
| 62 | +Знак каретки '^' и доллара '$' имеют в регулярном выражении особый смысл. Их называют «якорями» (anchor – англ.). |
| 63 | +
|
| 64 | +Каретка ^ совпадает в начале текста, а доллар $ – в конце. |
| 65 | +
|
| 66 | +Якоря являются не символами, а проверками. |
| 67 | +
|
| 68 | +До этого мы говорили о регулярных выражениях, которые ищут один или несколько символов. Если совпадение есть – эти символы включаются в результат. |
| 69 | +
|
| 70 | +А якоря – не такие. Когда поиск ходит до якоря – он проверяет, есть ли соответствие, если есть – продолжает идти по шаблону, не прибавляя ничего к результату. |
| 71 | +
|
| 72 | +Каретку ^ обычно используют, чтобы указать, что регулярное выражение необходимо проверить именно с начала текста. |
| 73 | +
|
| 74 | +Например, без каретки найдёт все числа: |
| 75 | +
|
| 76 | + var str = '100500 попугаев съели 500100 бананов!'; |
| 77 | +alert( str.match(/\d+/ig) ); // 100500, 500100 (нашло все числа) |
| 78 | +А с кареткой – только первое: |
| 79 | +
|
| 80 | +
|
| 81 | +
|
| 82 | +var str = '100500 попугаев съели 500100 бананов!'; |
| 83 | +alert( str.match(/^\d+/ig) ); // 100500 (только в начале строки) |
| 84 | +Знак доллара $ используют, чтобы указать, что паттерн должен заканчиваться в конце текста. |
| 85 | +
|
| 86 | +Аналогичный пример с долларом для поиска числа в конце: |
| 87 | +
|
| 88 | + var str = '100500 попугаев съели 500100'; |
| 89 | +alert( str.match(/\d+$/ig) ); // 500100 |
| 90 | +Оба якоря используют одновременно, если требуется, чтобы шаблон охватывал текст с начала и до конца. Обычно это требуется при валидации. |
| 91 | +
|
| 92 | +Например, мы хотим проверить, что в переменной num хранится именно десятичная дробь. |
| 93 | +
|
| 94 | +Ей соответствует регэксп \d+\.\d+. Но простой поиск найдёт дробь в любом тексте: |
| 95 | +
|
| 96 | + var num = "ля-ля 12.34"; |
| 97 | +alert( num.match(/\d+\.\d+/ig) ); // 12.34 |
| 98 | +Наша же задача – проверить, что num целиком соответствует паттерну \d+\.\d+. |
| 99 | +
|
| 100 | +Для этого обернём шаблон в якоря ^...$: |
| 101 | +
|
| 102 | + var num = "ля-ля 12.34"; |
| 103 | +alert( num.match(/^\d+\.\d+$/ig) ); // null, не дробь |
| 104 | +
|
| 105 | +var num = "12.34"; |
| 106 | +alert( num.match(/^\d+\.\d+$/ig) ); // 12.34, дробь! |
| 107 | +Теперь поиск ищет начало текста, за которым идёт число, затем точка, ещё число и конец текста. Это как раз то, что нужно. |
| 108 | +
|
| 109 | +Задачи |
| 110 | +Регэксп ^$ |
| 111 | +Предложите строку, которая подойдёт под регулярное выражение ^$. |
| 112 | +
|
| 113 | +решение |
| 114 | +Проверьте MAC-адрес |
| 115 | +MAC-адрес сетевого интерфейса состоит из шести двузначных шестнадцатеричных чисел, разделённых двоеточием. |
| 116 | +
|
| 117 | +Например: '01:32:54:67:89:AB'. |
| 118 | +
|
| 119 | +Напишите регулярное выражение, которое по строке проверяет, является ли она корректным MAC-адресом. |
| 120 | +
|
| 121 | +Использование: |
| 122 | +
|
| 123 | +var re = ваш регэксп |
| 124 | +
|
| 125 | +alert( re.test('01:32:54:67:89:AB') ); // true |
| 126 | +
|
| 127 | +alert( re.test('0132546789AB') ); // false (нет двоеточий) |
| 128 | +
|
| 129 | +alert( re.test('01:32:54:67:89') ); // false (5 чисел, а не 6) |
| 130 | +
|
| 131 | +alert( re.test('01:32:54:67:89:ZZ') ) // false (ZZ в конце) |
| 132 | +решение |
| 133 | +---> |
0 commit comments