Многострочный режим, флаг "m"

Многострочный режим включается, если у регэкспа есть флаг /m.

В этом случае изменяется поведение ^ и $.

В многострочном режиме якоря означают не только начало/конец текста, но и начало/конец строки.

Начало строки ^

В примере ниже текст состоит из нескольких строк. Паттерн /^\d+/gm берёт число с начала каждой строки:

var str = '1е место: Винни\n' +
  '2е место: Пятачок\n' +
  '33е место: Слонопотам';

alert( str.match(/^\d+/gm) ); // 1, 2, 33

Обратим внимание – без флага /m было бы найдено только первое число:

var str = '1е место: Винни\n' +
  '2е место: Пятачок\n' +
  '33е место: Слонопотам';

alert( str.match(/^\d+/g) ); // 1

Это потому что в обычном режиме каретка ^ – это только начало текста, а в многострочном – начало любой строки.

Движок регулярных выражений двигается по тексту, и как только видит начало строки, начинает искать там \d+.

Конец строки $

Символ доллара $ ведёт себя аналогично.

Регулярное выражение [а-я]+$ в следующем примере находит последнее слово в каждой строке:

var str = '1е место: Винни\n' +
  '2е место: Пятачок\n' +
  '33е место: Слонопотам';

alert( str.match(/[а-я]+$/gim) ); // Винни,Пятачок,Слонопотам

Без флага m якорь $ обозначал бы конец всего текста, и было бы найдено только последнее слово.

Якорь $ против \n

Для того, чтобы найти конец строки, можно использовать не только $, но и символ \n.

Но, в отличие от $, символ \n во-первых берёт символ в результат, а во-вторых – не совпадает в конце текста (если, конечно, последний символ – не конец строки).

Посмотрим, что будет с примером выше, если вместо [а-я]+$ использовать [а-я]+\n:

var str = '1е место: Винни\n' +
  '2е место: Пятачок\n' +
  '33е место: Слонопотам';

alert( str.match(/[а-я]+\n/gim) );
/*
Винни
,Пятачок
*/

Всего два результата: Винни\n (с символом перевода строки) и Пятачок\n. Последнее слово «Слонопотам» здесь не даёт совпадения, так как после него нет перевода строки.

Итого

В мультистрочном режиме:

  • Символ ^ означает начало строки.
  • Символ $ означает конец строки.

Оба символа являются проверками, они не добавляют ничего к результату. Про них также говорят, что «они имеют нулевую длину».

Карта учебника

Комментарии

перед тем как писать…
  • Приветствуются комментарии, содержащие дополнения и вопросы по статье, и ответы на них.
  • Для одной строки кода используйте тег <code>, для нескольких строк кода — тег <pre>, если больше 10 строк — ссылку на песочницу (plnkr, JSBin, codepen…)
  • Если что-то непонятно в статье — пишите, что именно и с какого места.