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

85 lines
4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Начало строки ^ и конец $
Знак каретки `pattern:'^'` и доллара `pattern:'$'` имеют в регулярном выражении особый смысл. Их называют "якорями" (anchor - англ.).
[cut]
Каретка `pattern:^` совпадает в начале текста, а доллар `pattern:$` -- в конце.
**Якоря являются не символами, а проверками.**
До этого мы говорили о регулярных выражениях, которые ищут один или несколько символов. Если совпадение есть -- эти символы включаются в результат.
А якоря -- не такие. Когда поиск ходит до якоря -- он проверяет, есть ли соответствие, если есть -- продолжает идти по шаблону, не прибавляя ничего к результату.
Каретку `pattern:^` обычно используют, чтобы указать, что регулярное выражение необходимо проверить именно с начала текста.
Например, без каретки найдёт все числа:
```js run
var str = '100500 попугаев съели 500100 бананов!';
alert( str.match(/\d+/ig) ); // 100500, 500100 (нашло все числа)
```
А с кареткой -- только первое:
```js run
var str = '100500 попугаев съели 500100 бананов!';
alert( str.match(/^\d+/ig) ); // 100500 (только в начале строки)*!*
```
Знак доллара `pattern:$` используют, чтобы указать, что паттерн должен заканчиваться в конце текста.
Аналогичный пример с долларом для поиска числа в конце:
```js run
var str = '100500 попугаев съели 500100';
alert( str.match(/\d+$/ig) ); // 500100
```
Оба якоря используют одновременно, если требуется, чтобы шаблон охватывал текст с начала и до конца. Обычно это требуется при валидации.
Например, мы хотим проверить, что в переменной `num` хранится именно десятичная дробь.
Ей соответствует регэксп `pattern:\d+\.\d+`. Но простой поиск найдёт дробь в любом тексте:
```js run
var num = "ля-ля 12.34";
alert( num.match(/\d+\.\d+/ig) ); // 12.34
```
Наша же задача -- проверить, что `num` *целиком* соответствует паттерну `pattern:\d+\.\d+`.
Для этого обернём шаблон в якоря `pattern:^...$`:
```js run
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:
```js run
let str = "I love Javascript!";
alert( str.search(/love/y) ); // -1 (not found)
alert( str.search(/LOVE/i) ); // 2
```