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,55 +5,85 @@
В этом случае изменяется поведение <code class="pattern">^</code> и <code class="pattern">$</code>.
**В многострочном режиме якоря означают не только начало/конец текста, но и начало/конец строки.**
В многострочном режиме якоря означают не только начало/конец текста, но и начало/конец строки.
## Начало строки ^
В примере ниже текст состоит из нескольких строк. Паттерн <code class="pattern">/^\d+/gm</code> берёт число с начала каждой строки:
```js
//+ run
var str = '1е место: Винни-пух\n' +
var str = '1е место: Винни\n' +
'2е место: Пятачок\n' +
'33е место: Слонопотам';
alert( str.match(/^\d+/gm) ); // 1, 2, 33*!*
*!*
alert( str.match(/^\d+/gm) ); // 1, 2, 33
*/!*
```
Обратим внимание -- без флага <code class="pattern">/m</code> было бы только первое число:
Обратим внимание -- без флага <code class="pattern">/m</code> было бы найдено только первое число:
```js
//+ run
var str = '1е место: Винни-пух\n' +
var str = '1е место: Винни\n' +
'2е место: Пятачок\n' +
'33е место: Слонопотам';
alert( str.match(/^\d+/g) ); // 1
```
Это потому что в обычном режиме каретка <code class="pattern">^</code> -- это только начало текста.
Это потому что в обычном режиме каретка <code class="pattern">^</code> -- это только начало текста, а в многострочном -- начало любой строки.
Символ доллара <code class="pattern">$</code> ведёт себя точно так же.
Движок регулярных выражений двигается по тексту, и как только видит начало строки, начинает искать там <code class="pattern">\d+</code>.
Следующий пример находит последнее слово в строке:
## Конец строки $
TODO: указать на коренное отличие $ от \n: доллар не матчит символ, а \n матчит!!!!
Символ доллара <code class="pattern">$</code> ведёт себя аналогично.
Регулярное выражение <code class="pattern">[а-я]+$</code> в следующем примере находит последнее слово в каждой строке:
```js
//+ run
showMatch(
'1st: *!*John*!*\n' +
'2nd: *!*Mary*/!*\n' +
'33rd: *!*Peter*/!*', /\w+$/gm ) // John, Mary, Peter
var str = '1е место: Винни\n' +
'2е место: Пятачок\n' +
'33е место: Слонопотам';
alert( str.match(/[а-я]+$/gim) ); // Винни,Пятачок,Слонопотам
```
Please note that <code class="pattern">$</code> as well as <code class="pattern">^</code> doesn't add <code class="match">\n</code> to the match. They only check that the position is right.
Без флага <code class="pattern">m</code> якорь <code class="pattern">$</code> обозначал бы конец всего текста, и было бы найдено только последнее слово.
[smart header="Якорь `$` против `\n`"]
Для того, чтобы найти конец строки, можно использовать не только `$`, но и символ `\n`.
[summary]
Но, в отличие от `$`, символ `\n` во-первых берёт символ в результат, а во-вторых -- не совпадает в конце текста (если, конечно, последний символ -- не конец строки).
Посмотрим, что будет с примером выше, если вместо <code class="pattern">[а-я]+$</code> использовать <code class="pattern">[а-я]+\n</code>:
```js
//+ run
var str = '1е место: Винни\n' +
'2е место: Пятачок\n' +
'33е место: Слонопотам';
alert( str.match(/[а-я]+\n/gim) );
/*
Винни
,Пятачок
*/
```
Всего два результата: <code class="match">Винни\n</code> (с символом перевода строки) и <code class="match">Пятачок\n</code>. Последнее слово "Слонопотам" здесь не даёт совпадения, так как после него нет перевода строки.
[/smart]
## Итого
В мультистрочном режиме:
<ul>
<li>The caret <code class="pattern">'^'</code> matches the position at the the text start. *In multiline mode* it also matches after the newline symbol.</li>
<li>The dollar <code class="pattern">'$'</code> matches the position at the text end. *In multiline mode* it also matches before the newline symbol.</li>
<li>Символ `^` означает начало строки.</li>
<li>Символ `$` означает конец строки.</li>
</ul>
**For both anchors, the regexp engine only checks the position, and doesn't match a character.**
[/summary]
Оба символа являются проверками, они не добавляют ничего к результату. Про них также говорят, что "они имеют нулевую длину".