Начало строки ^ и конец $

Знак каретки '^' и доллара '$' имеют в регулярном выражении особый смысл. Их называют «якорями» (anchor – англ.).

Каретка ^ совпадает в начале текста, а доллар $ – в конце.

Якоря являются не символами, а проверками.

До этого мы говорили о регулярных выражениях, которые ищут один или несколько символов. Если совпадение есть – эти символы включаются в результат.

А якоря – не такие. Когда поиск ходит до якоря – он проверяет, есть ли соответствие, если есть – продолжает идти по шаблону, не прибавляя ничего к результату.

Каретку ^ обычно используют, чтобы указать, что регулярное выражение необходимо проверить именно с начала текста.

Например, без каретки найдёт все числа:

var str = '100500 попугаев съели 500100 бананов!';
alert( str.match(/\d+/ig) ); // 100500, 500100 (нашло все числа)

А с кареткой – только первое:

var str = '100500 попугаев съели 500100 бананов!';
alert( str.match(/^\d+/ig) ); // 100500 (только в начале строки)

Знак доллара $ используют, чтобы указать, что паттерн должен заканчиваться в конце текста.

Аналогичный пример с долларом для поиска числа в конце:

var str = '100500 попугаев съели 500100';
alert( str.match(/\d+$/ig) ); // 500100

Оба якоря используют одновременно, если требуется, чтобы шаблон охватывал текст с начала и до конца. Обычно это требуется при валидации.

Например, мы хотим проверить, что в переменной num хранится именно десятичная дробь.

Ей соответствует регэксп \d+\.\d+. Но простой поиск найдёт дробь в любом тексте:

var num = "ля-ля 12.34";
alert( num.match(/\d+\.\d+/ig) ); // 12.34

Наша же задача – проверить, что num целиком соответствует паттерну \d+\.\d+.

Для этого обернём шаблон в якоря ^...$:

var num = "ля-ля 12.34";
alert( num.match(/^\d+\.\d+$/ig) ); // null, не дробь

var num = "12.34";
alert( num.match(/^\d+\.\d+$/ig) ); // 12.34, дробь!

Теперь поиск ищет начало текста, за которым идёт число, затем точка, ещё число и конец текста. Это как раз то, что нужно.

Задачи

Предложите строку, которая подойдёт под регулярное выражение ^$.

Нам нужна строка, которая начинается – и тут же кончается. То есть, пустая.

Или, если быть ближе к механике регэкспов, то движок сначала будет искать в тексте начальную позицию ^, а как только найдёт её – будет ожидать конечной $.

Заметим, что и ^ и $ не требуют наличия символов. Это – проверки. В пустой строке движок сначала проверит первую, а потом – вторую – и зафиксирует совпадение.

MAC-адрес сетевого интерфейса состоит из шести двузначных шестнадцатеричных чисел, разделённых двоеточием.

Например: '01:32:54:67:89:AB'.

Напишите регулярное выражение, которое по строке проверяет, является ли она корректным MAC-адресом.

Использование:

var re = ваш регэксп

alert( re.test('01:32:54:67:89:AB') ); // true

alert( re.test('0132546789AB') ); // false (нет двоеточий)

alert( re.test('01:32:54:67:89') ); // false (5 чисел, а не 6)

alert( re.test('01:32:54:67:89:ZZ') ) // false (ZZ в конце)

Двузначное шестнадцатиричное число – это [0-9a-f]{2} (с учётом флага /i).

Нам нужно одно такое число, и за ним ещё 5 с двоеточиями перед ними: [0-9a-f]{2}(:[0-9a-f]{2}){5}

И, наконец, совпадение должно начинаться в начале строки и заканчиваться – в конце. То есть, строка целиком должна подходить под шаблон. Для этого обернём шаблон в ^...$.

Итого, в действии:

var re = /^[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}$/i;

alert( re.test('01:32:54:67:89:AB') ); // true

alert( re.test('0132546789AB') ); // false (нет двоеточий)

alert( re.test('01:32:54:67:89') ); // false (5 чисел, а не 6)

alert( re.test('01:32:54:67:89:ZZ') ) // false (ZZ в конце)
Карта учебника

Комментарии

перед тем как писать…
  • Приветствуются комментарии, содержащие дополнения и вопросы по статье, и ответы на них.
  • Для одной строки кода используйте тег <code>, для нескольких строк кода — тег <pre>, если больше 10 строк — ссылку на песочницу (plnkr, JSBin, codepen…)
  • Если что-то непонятно в статье — пишите, что именно и с какого места.