Пошук уроків, статей та іншого контенту
Навчитеся обмежувати збіг початком і кінцем рядка, позицією слова та режимами багаторядкового пошуку.
Регулярний вираз зазвичай шукає збіг у будь-якому місці рядка. Наприклад:
const text = "Мій код: JS";
console.log(/JS/.test(text)); // trueАле іноді потрібно перевірити, що:
рядок починається з певного тексту;
рядок закінчується певним текстом;
збіг розташований на початку або в кінці кожного рядка;
слово стоїть окремо, а не є частиною іншого слова.
Для цього використовують якори та межі збігу.
Якорі й межі не споживають символи рядка. Вони перевіряють позицію, у якій знаходиться регулярний вираз.
^Символ ^ означає: збіг має починатися з початку рядка.
console.log(/^Hello/.test("Hello, world")); // true
console.log(/^Hello/.test("Say Hello")); // falseРегулярний вираз /^Hello/ шукає Hello лише на початку рядка.
Без якоря початок рядка не має значення:
console.log(/Hello/.test("Say Hello")); // trueЯкір ^ зручно використовувати для перевірки префікса:
const fileName = "report.pdf";
if (/^report/.test(fileName)) {
console.log("Файл починається з report");
}Зверніть увагу: цей вираз перевіряє лише початок. Рядок "report.txt" також відповідатиме умові.
$Символ $ означає: збіг має закінчуватися в кінці рядка.
console.log(/world$/.test("Hello, world")); // true
console.log(/world$/.test("world!")); // falseВираз /world$/ відповідає лише рядку, який закінчується на world.
Наприклад, можна перевірити розширення файлу:
const fileName = "photo.jpg";
console.log(/\.jpg$/.test(fileName)); // trueКрапка має спеціальне значення в регулярних виразах: вона означає «будь-який символ». Тому для пошуку саме крапки її екранують як \..
^ і $Якщо потрібно перевірити весь рядок, поєднайте початок і кінець:
console.log(/^\d+$/.test("12345")); // true
console.log(/^\d+$/.test("123abc")); // false
console.log(/^\d+$/.test("abc123")); // falseТут:
^ — початок рядка;
\d — цифра;
+ — одна або більше цифр;
$ — кінець рядка.
Такий вираз перевіряє, що весь рядок складається лише з цифр.
Ще один приклад:
function isThreeLetterCode(value) {
return /^[A-Z]{3}$/.test(value);
}
console.log(isThreeLetterCode("USA")); // true
console.log(isThreeLetterCode("UA")); // false
console.log(isThreeLetterCode("USA1")); // falseБез якорів вираз /[A-Z]{3}/ міг би знайти три великі літери всередині довшого рядка:
console.log(/[A-Z]{3}/.test("Код USA")); // trueА вираз /^[A-Z]{3}$/ вимагає, щоб увесь рядок складався рівно з трьох великих латинських літер.
\bПозначення \b означає межу слова.
Межа слова — це позиція між:
символом слова і символом, який не є символом слова;
початком рядка та символом слова;
символом слова та кінцем рядка.
У JavaScript до символів слова для \b належать переважно латинські літери A-Z, a-z, цифри та символ _.
console.log(/\bcat\b/.test("A cat")); // true
console.log(/\bcat\b/.test("cat food")); // true
console.log(/\bcat\b/.test("catalog")); // falseБез \b слово cat знайшлося б і всередині catalog:
console.log(/cat/.test("catalog")); // trueА з межами слова регулярний вираз шукає саме окреме слово:
console.log(/\bcat\b/.test("catalog")); // falseconsole.log(/\bJavaScript/.test("JavaScript is useful")); // true
console.log(/\bJavaScript/.test("Learn JavaScript")); // trueУ першому випадку JavaScript стоїть на початку рядка, а в другому перед ним є пробіл. Обидві позиції є межами слова.
console.log(/JavaScript\b/.test("JavaScript")); // true
console.log(/JavaScript\b/.test("JavaScript!")); // true
console.log(/JavaScript\b/.test("JavaScripting")); // falseЗнак оклику не є символом слова, тому після JavaScript є межа слова.
\BПозначення \B означає позицію, яка не є межею слова.
Наприклад:
console.log(/\Bcat/.test("catalog")); // true
console.log(/\Bcat/.test("cat")); // falseУ слові catalog перед cat немає межі: перед c немає іншого символу слова, але сам фрагмент починається на початку слова. Для /\Bcat/ це не підходить? Actually in catalog, before c start string is boundary, so \Bcat false. Need correct example \B cat perhaps "educate"? substring cat preceded u word and c word, yes. Let's fix. educate contains cat? educate letters e d u c a t e = "cat" positions c a t, preceded u, so \Bcat true. Need explain. Also \B after maybe cat within catalog: cat\B true because after t is a word char. use. Let's formulate.
\B useful rarely. Ensure correctness Unicode caveat perhaps Ukrainian words: \b does not recognize Ukrainian letters as word chars in ordinary JS regex, surprising. Mention with u? JS \b semantics case folding ASCII under i/u perhaps Ukrainian still no. Say for Ukrainian text don't rely on \b for word boundaries; use lookarounds perhaps beginner but can show (?<!\p{L})... with u? Unicode property escapes supported modern JS, lookbehind not all environments. Avoid maybe note.
Need runnable code. Include m behavior. ^ $ default whole input, m each line. Example split? const text = ...; console.log(text.match(/^ERROR:.*$/gm)); . doesn't newline. Good.
Need explain $ final newline nuance maybe not necessary.
Also full lesson. Common mistakes. Comments Ukrainian inside code. Ensure comments Ukrainian. Code runnable likely Node/browser. Use console.
Let's draft. Correct \B examples.
Need note flags order gm.
Word boundaries and hyphen: \b ASCII. Ukrainian caveat important because lesson Ukrainian. Could explain /\bслово\b/ may not behave expected around Cyrillic. In JS \b based on ASCII word chars, so at start/end? For Cyrillic adjacent, considered non-word; searching "слово" with \b maybe boundaries at positions? Since Cyrillic are non-word, between start and Cyrillic both non-word => no boundary, so false. Mention use spaces/punctuation or Unicode lookarounds with \p{L}. Could include regex (?<![\p{L}\p{N}_])слово(?![\p{L}\p{N}_]) requires lookbehind. Beginner maybe don't overcomplicate. State use domain-specific.
Need no links. Let's deliver.