1 ноября 2021 г.

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

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

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

Комментарии

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