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

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