Многострочный режим включается флагом pattern:m
.
Он влияет только на поведение pattern:^
и pattern:$
.
В многострочном режиме они означают не только начало/конец текста, но и начало/конец каждой строки в тексте.
В примере ниже текст состоит из нескольких строк. Шаблон pattern:/^\d/gm
берёт цифру с начала каждой строки:
let str = `1е место: Винни
2е место: Пятачок
3е место: Слонопотам`;
*!*
console.log( str.match(/^\d/gm) ); // 1, 2, 3
*/!*
Обратим внимание -- без флага pattern:m
было бы найдено только первое число:
let str = `1е место: Винни
2е место: Пятачок
3е место: Слонопотам`;
*!*
console.log( str.match(/^\d/g) ); // 1
*/!*
Так происходит, потому что в обычном режиме каретка pattern:^
-- это только начало текста, а в многострочном -- начало любой строки.
"Начало строки", формально, означает "сразу после перевода строки", то есть проверка `pattern:^` в многострочном режиме верна на всех позициях, которым предшествует символ перевода строки `\n`.
И в начале текста.
Якорь pattern:$
ведёт себя аналогично.
Регулярное выражение pattern:/\d$/gm
ищет последнюю цифру в каждой строке:
let str = `Винни: 1
Пятачок: 2
Слонопотам: 3`;
console.log( str.match(/\d$/gm) ); // 1, 2, 3
Без флага pattern:m
якорь pattern:$
обозначал бы конец всей строки, и была бы найдена только последняя цифра.
Для того, чтобы найти конец строки, можно использовать не только якоря pattern:^
и pattern:$
, но и символ перевода строки \n
.
В чём разница? Давайте посмотрим на примере.
Поищем pattern:\d\n
вместо pattern:\d$
:
let str = `Винни: 1
Пятачок: 2
Слонопотам: 3`;
console.log( str.match(/\d\n/g) ); // 1\n,2\n
Как видим, совпадений теперь два, а не три.
Это потому, что после subject:3
нет перевода строки (а конец текста, подходящий под pattern:$
- есть).
Ещё одно отличие: теперь в каждое найденное совпадение входит символ перевода строки match:\n
. В отличие от якорей pattern:^
pattern:$
, которые только проверяют условие (начало/конец строки), \n
- символ и входит в результат.
Так что \n
в шаблоне используется, когда нам нужен сам символ перевода строки в результате, а якоря - когда хотим найти что-то в начале/конце строки.