Многострочный режим включается флагом 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
в шаблоне используется, когда нам нужен сам символ перевода строки в результате, а якоря – когда хотим найти что-то в начале/конце строки.