en.javascript.info/10-regular-expressions-javascript/12-regexp-ahchors/article.md
Ilya Kantor 62c507c78f ok
2017-03-19 20:40:47 +03:00

4 KiB
Raw Blame History

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

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

[cut]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

TODO

Add y flag here

The "y" flag

The y flag means that the match should start exactly at the position specified by the property regexp.lastIndex.

In other words, normally the search is made in the whole string: pattern:/love/ checks if the word "love" is found on the first position in the string, then in the second etc. In the example above we have a match on the 2nd position.

But with the y flag we need to specify the position in regexp.lastIndex (0 by default), and the match must be exactly on that position.

Here, the example:

let str = "I love Javascript!";

alert( str.search(/love/y) ); // -1 (not found)
alert( str.search(/LOVE/i) ); // 2