62 lines
3.2 KiB
Markdown
62 lines
3.2 KiB
Markdown
# Начало ^ и конец $ строки, многострочный режим
|
||
|
||
Знак каретки <code class="pattern">'^'</code> и доллара <code class="pattern">'$'</code> имеют в регулярном выражении особый смысл. Их называют "якорями" (anchor - англ.).
|
||
[cut]
|
||
|
||
Каретка <code class="pattern">^</code> совпадает в начале текста, а доллар <code class="pattern">$</code> -- в конце.
|
||
|
||
**Якоря являются не символами, а проверками. Они совпадают на "позиции".**
|
||
|
||
Это очень важное отличие по сравнению с символьными классами. Если движок регулярных выражений видит <code class="pattern">^</code> -- он *проверяет* начало текста, <code class="pattern">$</code> -- проверяет конец текста, при этом *никаких символов к совпадению не добавляется*.
|
||
|
||
Каретку <code class="pattern">^</code> обычно используют, чтобы указать, что регулярное выражение необходимо проверить именно с начала текста.
|
||
|
||
Например, без каретки:
|
||
|
||
```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 (только в начале строки)*!*
|
||
```
|
||
|
||
Знак доллара <code class="pattern">$</code> используют, чтобы указать, что паттерн должен заканчиваться в конце текста.
|
||
|
||
Тот же пример с долларом:
|
||
|
||
```js
|
||
//+ run
|
||
var str = '100500 попугаев съели 500100 бананов!';
|
||
alert(str.match(/\d+$/ig) // null (в начале строки чисел нет)*!*
|
||
```
|
||
|
||
Якоря используют одновременно, чтобы указать, что паттерн должен охватывать текст с начала и до конца. Обычно это требуется при валидации.
|
||
|
||
Например, мы хотим проверить, что в переменной `num` хранится именно десятичная дробь.
|
||
|
||
Ей соответствует регэксп <code class="pattern">\d+\.\d+</code>. Но простая проверка найдёт дробь в любом тексте:
|
||
|
||
```js
|
||
//+ run
|
||
var num = "ля-ля 12.34";
|
||
alert( num.match(/\d+\.\d+/ig) ); // 12.34
|
||
```
|
||
|
||
Если мы хотим проверить, что `num` *целиком* соответствует паттерну <code class="pattern">\d+\.\d+</code>, то укажем якоря по обе стороны от него:
|
||
|
||
```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, дробь!
|
||
```
|
||
|