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

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

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

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

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

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

let str = `1е место: Винни
2е место: Пятачок
33е место: Слонопотам`;

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

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

let str = `1е место: Винни
2е место: Пятачок
33е место: Слонопотам`;

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

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

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

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

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

Регулярное выражение \w+$ ищет последнее слово в каждой строке

let str = `1е место: Винни
2е место: Пятачок
33е место: Слонопотам`;

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

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

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

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

Но, в отличие от $, движок регулярных выражений берёт символ \n в результат.

Используем его в нашем примере вместо $:

let str = `1е место: Винни
2е место: Пятачок
33е место: Слонопотам`;

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

Здесь каждое совпадение – это слово плюс символ перевода строки.

Ещё одно отличие – символ перевода строки \n не обязательно является концом строки. Вот почему слово Слонопотам не вывелось в примере выше.

Таким образом, использование якорей обычно лучше и точнее соответствуют тому, что мы хотим получить в результате.

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

Комментарии

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