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