Многострочный режим включается флагом m.
Он влияет только на поведение ^ и $.
В многострочном режиме они означают не только начало/конец текста, но и начало/конец каждой строки в тексте.
Поиск в начале строки ^
В примере ниже текст состоит из нескольких строк. Шаблон /^\d/gm берёт цифру с начала каждой строки:
let str = `1е место: Винни
2е место: Пятачок
3е место: Слонопотам`;
console.log( str.match(/^\d/gm) ); // 1, 2, 3
Обратим внимание – без флага m было бы найдено только первое число:
let str = `1е место: Винни
2е место: Пятачок
3е место: Слонопотам`;
console.log( str.match(/^\d/g) ); // 1
Так происходит, потому что в обычном режиме каретка ^ – это только начало текста, а в многострочном – начало любой строки.
«Начало строки», формально, означает «сразу после перевода строки», то есть проверка ^ в многострочном режиме верна на всех позициях, которым предшествует символ перевода строки \n.
И в начале текста.
Поиск в конце строки $
Символ доллара $ ведёт себя аналогично.
Регулярное выражение \d$ ищет последнюю цифру в каждой строке
let str = `Винни: 1
Пятачок: 2
Слонопотам: 3`;
console.log( str.match(/\d$/gm) ); // 1,2,3
Без флага m якорь $ обозначал бы конец всей строки, и была бы найдена только последняя цифра.
Ищем \n вместо ^ $
Для того, чтобы найти конец строки, можно использовать не только якоря ^ и $, но и символ перевода строки \n.
В чём разница? Давайте посмотрим на примере.
Поищем \d\n вместо \d$:
let str = `Винни: 1
Пятачок: 2
Слонопотам: 3`;
console.log( str.match(/\d\n/g) ); // 1\n,2\n
Как видим, совпадений теперь два, а не три.
Это потому, что после 3 нет перевода строки (а конец текста, подходящий под $ – есть).
Ещё одно отличие: теперь в каждое найденное совпадение входит символ перевода строки \n. В отличие от якорей ^ $, которые только проверяют условие (начало/конец строки), \n – символ и входит в результат.
Так что \n в шаблоне используется, когда нам нужен сам символ перевода строки в результате, а якоря – когда хотим найти что-то в начале/конце строки.
Комментарии
<code>, для нескольких строк кода — тег<pre>, если больше 10 строк — ссылку на песочницу (plnkr, JSBin, codepen…)