renovate regexps

This commit is contained in:
Ilya Kantor 2015-03-22 18:54:57 +03:00
parent 9122b131d0
commit f6f6b20178
17 changed files with 397 additions and 138 deletions

View file

@ -5,43 +5,45 @@
Каретка <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 (все числа)
alert( str.match(/\d+/ig) ); // 100500, 500100 (нашло все числа)
```
А с кареткой:
А с кареткой -- только первое:
```js
//+ run
var str = '100500 попугаев съели 500100 бананов!';
alert(str.match(/^\d+/ig) // 100500 (только в начале строки)*!*
alert( str.match(/^\d+/ig) ); // 100500 (только в начале строки)*!*
```
Знак доллара <code class="pattern">$</code> используют, чтобы указать, что паттерн должен заканчиваться в конце текста.
Тот же пример с долларом:
Аналогичный пример с долларом для поиска числа в конце:
```js
//+ run
var str = '100500 попугаев съели 500100 бананов!';
alert(str.match(/\d+$/ig) // null (в начале строки чисел нет)*!*
var str = '100500 попугаев съели 500100';
alert( str.match(/\d+$/ig) ); // 500100
```
Якоря используют одновременно, чтобы указать, что паттерн должен охватывать текст с начала и до конца. Обычно это требуется при валидации.
Оба якоря используют одновременно, если требуется, чтобы шаблон охватывал текст с начала и до конца. Обычно это требуется при валидации.
Например, мы хотим проверить, что в переменной `num` хранится именно десятичная дробь.
Например, мы хотим проверить, что в переменной `num` хранится именно десятичная дробь.
Ей соответствует регэксп <code class="pattern">\d+\.\d+</code>. Но простая проверка найдёт дробь в любом тексте:
Ей соответствует регэксп <code class="pattern">\d+\.\d+</code>. Но простой поиск найдёт дробь в любом тексте:
```js
//+ run
@ -49,7 +51,9 @@ var num = "ля-ля 12.34";
alert( num.match(/\d+\.\d+/ig) ); // 12.34
```
Если мы хотим проверить, что `num` *целиком* соответствует паттерну <code class="pattern">\d+\.\d+</code>, то укажем якоря по обе стороны от него:
Наша же задача -- проверить, что `num` *целиком* соответствует паттерну <code class="pattern">\d+\.\d+</code>.
Для этого обернём шаблон в якоря <code class="pattern">^...$</code>:
```js
//+ run
@ -60,3 +64,5 @@ var num = "12.34";
alert( num.match(/^\d+\.\d+$/ig) ); // 12.34, дробь!
```
Теперь поиск ищет начало текста, за которым идёт число, затем точка, ещё число и конец текста. Это как раз то, что нужно.