en.javascript.info/11-regular-expressions-javascript/14-regexp-multiline-mode/article.md
2015-03-24 00:03:51 +03:00

89 lines
4.1 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.

# Многострочный режим, флаг "m"
Многострочный режим включается, если у регэкспа есть флаг <code class="pattern">/m</code>.
[cut]
В этом случае изменяется поведение <code class="pattern">^</code> и <code class="pattern">$</code>.
В многострочном режиме якоря означают не только начало/конец текста, но и начало/конец строки.
## Начало строки ^
В примере ниже текст состоит из нескольких строк. Паттерн <code class="pattern">/^\d+/gm</code> берёт число с начала каждой строки:
```js
//+ run
var str = '1е место: Винни\n' +
'2е место: Пятачок\n' +
'33е место: Слонопотам';
*!*
alert( str.match(/^\d+/gm) ); // 1, 2, 33
*/!*
```
Обратим внимание -- без флага <code class="pattern">/m</code> было бы найдено только первое число:
```js
//+ run
var str = '1е место: Винни\n' +
'2е место: Пятачок\n' +
'33е место: Слонопотам';
alert( str.match(/^\d+/g) ); // 1
```
Это потому что в обычном режиме каретка <code class="pattern">^</code> -- это только начало текста, а в многострочном -- начало любой строки.
Движок регулярных выражений двигается по тексту, и как только видит начало строки, начинает искать там <code class="pattern">\d+</code>.
## Конец строки $
Символ доллара <code class="pattern">$</code> ведёт себя аналогично.
Регулярное выражение <code class="pattern">[а-я]+$</code> в следующем примере находит последнее слово в каждой строке:
```js
//+ run
var str = '1е место: Винни\n' +
'2е место: Пятачок\n' +
'33е место: Слонопотам';
alert( str.match(/[а-я]+$/gim) ); // Винни,Пятачок,Слонопотам
```
Без флага <code class="pattern">m</code> якорь <code class="pattern">$</code> обозначал бы конец всего текста, и было бы найдено только последнее слово.
[smart header="Якорь `$` против `\n`"]
Для того, чтобы найти конец строки, можно использовать не только `$`, но и символ `\n`.
Но, в отличие от `$`, символ `\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>Символ `^` означает начало строки.</li>
<li>Символ `$` означает конец строки.</li>
</ul>
Оба символа являются проверками, они не добавляют ничего к результату. Про них также говорят, что "они имеют нулевую длину".