85 lines
3.8 KiB
Markdown
85 lines
3.8 KiB
Markdown
# Многострочный режим, флаг "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`. Последнее слово "Слонопотам" здесь не даёт совпадения, так как после него нет перевода строки.
|
||
````
|
||
|
||
## Итого
|
||
|
||
В мультистрочном режиме:
|
||
|
||
- Символ `^` означает начало строки.
|
||
- Символ `$` означает конец строки.
|
||
|
||
Оба символа являются проверками, они не добавляют ничего к результату. Про них также говорят, что "они имеют нулевую длину".
|
||
|