Skip to content

Latest commit

 

History

History
81 lines (52 loc) · 3.68 KB

File metadata and controls

81 lines (52 loc) · 3.68 KB

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

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

Ищем \n вместо ^ $

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