29 жовтня 2024 р.

Багаторядковий режим якорів ^ $, прапора "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 замість ^ $

Щоб знайти новий рядок, ми можемо використовувати не лише якорі ^ і $, а й символ нового рядка \n.

У чому різниця? Подивімось на приклад.

Тут ми шукаємо \d\n замість \d$:

let str = `Вінні: 1
Паць: 2
Слонопотам: 3`;

console.log( str.match(/\d\n/g) ); // 1\n,2\n

Як бачимо, 2 збіги замість 3-х.

Це тому, що після об'єкт:3 немає нового рядка (хоча є кінець тексту, тому він відповідає $).

Ще одна відмінність: тепер кожен збіг містить символ нового рядка \n. На відміну від якорів ^ $, які лише перевіряють умову (початок/кінець рядка), \n є символом, тому він стає частиною результату.

Отже, \n у шаблоні використовується, коли нам потрібні символи нового рядка в результаті, тоді як якорі використовуються, щоб знайти щось на початку/кінці рядка.

Навчальна карта