diff --git a/9-regular-expressions/01-regexp-introduction/article.md b/9-regular-expressions/01-regexp-introduction/article.md index ade62cdf2..79a1317a5 100644 --- a/9-regular-expressions/01-regexp-introduction/article.md +++ b/9-regular-expressions/01-regexp-introduction/article.md @@ -1,177 +1,174 @@ -# Patterns and flags +# Вступ: шаблони та прапори -Regular expressions are patterns that provide a powerful way to search and replace in text. +Регулярні вирази – потужний засіб пошуку та заміни тексту в рядках. -In JavaScript, they are available via the [RegExp](mdn:js/RegExp) object, as well as being integrated in methods of strings. +В JavaScript регулярні вирази реалізовані окремим об’єктом [RegExp](mdn:js/RegExp) та інтегровані у методи рядків. -## Regular Expressions +## Регулярні вирази -A regular expression (also "regexp", or just "reg") consists of a *pattern* and optional *flags*. +Регулярний вираз (він же "регексп", "регулярка" або просто "рег"), складається з *шаблону* (також кажуть "патерн") і необов’язкових *прапорів*. -There are two syntaxes that can be used to create a regular expression object. +Існує два синтаксиси для створення регулярного виразу. -The "long" syntax: +"Довгий" синтаксис: ```js -regexp = new RegExp("pattern", "flags"); +regexp = new RegExp ("шаблон", "прапори"); ``` -And the "short" one, using slashes `"/"`: +Та "короткий" синтаксис, в якому використовуються слеши `"/"`: ```js -regexp = /pattern/; // no flags -regexp = /pattern/gmi; // with flags g,m and i (to be covered soon) +regexp = /шаблон/; // без прапорів +regexp = /шаблон/gmi; // з прапорами g,m та i (будуть описані далі) ``` -Slashes `pattern:/.../` tell JavaScript that we are creating a regular expression. They play the same role as quotes for strings. +Слеши `pattern:/.../` говорять JavaScript про те, що це регулярний вираз. Вони відіграють таку саму роль, як і лапки для позначення рядків. -In both cases `regexp` becomes an instance of the built-in `RegExp` class. +Регулярний вираз `regexp` в обох випадках є об’єктом вбудованого класу `RegExp`. -The main difference between these two syntaxes is that pattern using slashes `/.../` does not allow for expressions to be inserted (like string template literals with `${...}`). They are fully static. +Основна різниця між цими двома синтаксами полягає в тому, що слеши `/.../` не допускають жодних вставок змінних (на зразок тих, що прописуються через `${...}`). Вони повністю статичні. -Slashes are used when we know the regular expression at the code writing time -- and that's the most common situation. While `new RegExp` is more often used when we need to create a regexp "on the fly" from a dynamically generated string. For instance: +Слеши використовуються, коли ми на момент написання коду точно знаємо, яким буде регулярний вираз - і це більшість ситуацій. А `new RegExp` - коли ми хочемо створити регулярний вираз "на льоту" з динамічно згенерованого рядка, наприклад: ```js -let tag = prompt("What tag do you want to find?", "h2"); +let tag = prompt("Який тег ви хочете знайти?", "h2"); -let regexp = new RegExp(`<${tag}>`); // same as /

/ if answered "h2" in the prompt above +let regexp = new RegExp(`<${tag}>`); // те саме, що /

/ при відповіді "h2" на запит вище ``` -## Flags +## Прапори -Regular expressions may have flags that affect the search. +Регулярні вирази можуть мати прапори, які впливають на пошук. -There are only 6 of them in JavaScript: +У JavaScript їх всього шість: `pattern:i` -: With this flag the search is case-insensitive: no difference between `A` and `a` (see the example below). +: З цим прапором пошук не залежить від регістру: немає різниці між `A` та `a` (див. приклад нижче). `pattern:g` -: With this flag the search looks for all matches, without it -- only the first match is returned. +: З цим прапором пошук шукає всі збіги, без нього - лише перше. `pattern:m` -: Multiline mode (covered in the chapter ). +: Багаторядковий режим (розглядається в розділі ). `pattern:s` -: Enables "dotall" mode, that allows a dot `pattern:.` to match newline character `\n` (covered in the chapter ). +: Вмикає режим "dotall", при якому крапка `pattern:.` може відповідати символу нового рядка `\n` (розглядається у розділі ). `pattern:u` -: Enables full Unicode support. The flag enables correct processing of surrogate pairs. More about that in the chapter . +: Вмикає повну підтримку Юнікоду. Прапор дозволяє коректну обробку сурогатних пар (докладніше про це у розділі ). `pattern:y` -: "Sticky" mode: searching at the exact position in the text (covered in the chapter ) +: Режим пошуку на конкретній позиції в тексті (описаний у розділі ) -```smart header="Colors" -From here on the color scheme is: +```smart header="Кольорові позначення" +Тут і далі в тексті використовується наступна колірна схема: -- regexp -- `pattern:red` -- string (where we search) -- `subject:blue` -- result -- `match:green` +- регулярний вираз - `pattern:червоний` +- рядок (там, де відбувається пошук) -- `subject:синій` +- результат -- `match:зелений` ``` -## Searching: str.match +## Пошук: str.match -As mentioned previously, regular expressions are integrated with string methods. +Як вже згадувалося, використання регулярних виразів інтегровано у методи рядків. -The method `str.match(regexp)` finds all matches of `regexp` in the string `str`. +Метод `str.match(regexp)` для рядка `str` повертає збіги з регулярним виразом `regexp`. -It has 3 working modes: +У нього є три режими роботи: -1. If the regular expression has flag `pattern:g`, it returns an array of all matches: - ```js run - let str = "We will, we will rock you"; +1. Якщо в регулярного виразу є прапор `pattern:g`, то він повертає масив всіх збігів: + ```js run + let str = "За Вас правда, за вас слава і воля святая!"; + alert(str.match(/вас/gi)); // Вас, вас (масив із 2х підрядків-збігів) + ``` + Зверніть увагу: знайдено як `match:Вас` так і `match:вас`, завдяки прапору `pattern:i`, який робить регулярний вираз реєстронезалежним. - alert( str.match(/we/gi) ); // We,we (an array of 2 substrings that match) - ``` - Please note that both `match:We` and `match:we` are found, because flag `pattern:i` makes the regular expression case-insensitive. +2. Якщо такого прапора немає, то повертається лише перший збіг у вигляді масиву, в якому за індексом `0` знаходиться збіг, і є властивості з додатковою інформацією про нього: + ```js run + let str = "За Вас правда, за вас слава і воля святая!"; -2. If there's no such flag it returns only the first match in the form of an array, with the full match at index `0` and some additional details in properties: - ```js run - let str = "We will, we will rock you"; + let result = str.match(/вас/i); // без прапора g - let result = str.match(/we/i); // without flag g + alert(result[0]); // Вас (перший збіг) + alert(result.length); // 1 - alert( result[0] ); // We (1st match) - alert( result.length ); // 1 + // Додаткова інформація: + alert(result.index); // 0 (позиція збігу) + alert(result.input); // За Вас правда, за вас слава і воля святая! (вихідний рядок) + ``` + У цьому масиві можуть бути інші індекси, крім `0`, якщо частина регулярного виразу виділена в дужки. Ми розберемо це у розділі . - // Details: - alert( result.index ); // 0 (position of the match) - alert( result.input ); // We will, we will rock you (source string) - ``` - The array may have other indexes, besides `0` if a part of the regular expression is enclosed in parentheses. We'll cover that in the chapter . +3. І, нарешті, якщо збігів немає, то, незалежно від наявності прапора `pattern:g`, повертається `null`. -3. And, finally, if there are no matches, `null` is returned (doesn't matter if there's flag `pattern:g` or not). + Це дуже важливий аспект. За відсутності збігів повертається не порожній масив, а саме `null`. Якщо про це забути, можна легко припуститися помилки, наприклад: - This a very important nuance. If there are no matches, we don't receive an empty array, but instead receive `null`. Forgetting about that may lead to errors, e.g.: + ```js run + let matches = "JavaScript". match(/HTML/); // = null + if (!matches.length) { // Помилка: у null немає властивості length + alert("Помилка у рядку вище"); + } + ``` - ```js run - let matches = "JavaScript".match(/HTML/); // = null + Якщо хочеться, щоб результатом завжди був масив, можна написати так: - if (!matches.length) { // Error: Cannot read property 'length' of null - alert("Error in the line above"); - } - ``` + ```js run + let matches = "JavaScript".match(/HTML/)*!* || []*/!*; + if (!matches.length) { + alert("Збігів немає"); // тепер працює + } + ``` - If we'd like the result to always be an array, we can write it this way: +## Заміна: str.replace - ```js run - let matches = "JavaScript".match(/HTML/)*!* || []*/!*; +Метод `str.replace(regexp, replacement)` замінює збіги з `regexp` у рядку `str` на `replacement` (всі збіги, якщо є прапор `pattern:g`, інакше тільки перше). - if (!matches.length) { - alert("No matches"); // now it works - } - ``` - -## Replacing: str.replace - -The method `str.replace(regexp, replacement)` replaces matches found using `regexp` in string `str` with `replacement` (all matches if there's flag `pattern:g`, otherwise, only the first one). - -For instance: +Наприклад: ```js run -// no flag g -alert( "We will, we will".replace(/we/i, "I") ); // I will, we will +// без прапора g +alert( "Ми будемо, ми будемо".replace(/ми/i, "Я") ); // Я будемо, я будемо -// with flag g -alert( "We will, we will".replace(/we/ig, "I") ); // I will, I will +// з прапором g +alert( "Ми будемо, ми будемо".replace(/ми/ig, "Я") ); // Я будемо, Я будемо ``` -The second argument is the `replacement` string. We can use special character combinations in it to insert fragments of the match: +У рядку заміни `replacement` ми можемо використовувати спеціальні комбінації символів для вставки фрагментів збігу: -| Symbols | Action in the replacement string | +| Спецсимволи | Дія у рядку заміни | |--------|--------| -|`$&`|inserts the whole match| -|$`|inserts a part of the string before the match| -|`$'`|inserts a part of the string after the match| -|`$n`|if `n` is a 1-2 digit number, then it inserts the contents of n-th parentheses, more about it in the chapter | -|`$`|inserts the contents of the parentheses with the given `name`, more about it in the chapter | -|`$$`|inserts character `$` | +|`$&`|вставляє всі знайдені збіги| +|$`|вставляє частину рядка до збігу| +|`$'`|вставляє частину рядка після збігу| +|`$n`|якщо `n` це 1-2 значне число, вставляє вміст n-ї скобочної групи регулярного виразу, більше у розділі | +|`$`|вставляє вміст скобочної групи з ім'ям `name`, також вивчимо у розділі | +|`$$`|вставляє символ `"$"` | -An example with `pattern:$&`: +Приклад з `pattern:$&`: ```js run -alert( "I love HTML".replace(/HTML/, "$& and JavaScript") ); // I love HTML and JavaScript +alert( "Люблю HTML".replace(/HTML/, "$& і JavaScript") ); // Люблю HTML і JavaScript ``` -## Testing: regexp.test +## Перевірка: regexp.test -The method `regexp.test(str)` looks for at least one match, if found, returns `true`, otherwise `false`. +Метод `regexp.test(str)` перевіряє, чи є хоч один збіг, якщо так, то повертає `true`, інакше `false`. ```js run -let str = "I love JavaScript"; -let regexp = /LOVE/i; +let str = "Я люблю JavaScript"; +let regexp = /люблю/i; alert( regexp.test(str) ); // true ``` -Later in this chapter we'll study more regular expressions, walk through more examples, and also meet other methods. +Далі в цьому розділі ми вивчатимемо регулярні вирази, побачимо ще багато прикладів їх використання, а також познайомимося з іншими методами. -Full information about the methods is given in the article . +Повна інформація про різні методи наведена в розділі . -## Summary +## Підсумки -- A regular expression consists of a pattern and optional flags: `pattern:g`, `pattern:i`, `pattern:m`, `pattern:u`, `pattern:s`, `pattern:y`. -- Without flags and special symbols (that we'll study later), the search by a regexp is the same as a substring search. -- The method `str.match(regexp)` looks for matches: all of them if there's `pattern:g` flag, otherwise, only the first one. -- The method `str.replace(regexp, replacement)` replaces matches found using `regexp` with `replacement`: all of them if there's `pattern:g` flag, otherwise only the first one. -- The method `regexp.test(str)` returns `true` if there's at least one match, otherwise, it returns `false`. +- Регулярний вираз складається з шаблону і необов’язкових прапорів: `pattern:g`, `pattern:i`, `pattern:m`, `pattern:u`, `pattern:s`, `pattern:y`. +- Без прапорів та спеціальних символів, які ми вивчимо пізніше, пошук за регулярним виразом аналогічний пошуку підрядка. +- Метод `str.match(regexp)` шукає збіги: всі, якщо є прапор `pattern:g`, інакше тільки перший. +- Метод `str.replace(regexp, replacement)` замінює збіги з `regexp` на `replacement`: всі, якщо у регулярного виразу є прапор `pattern:g`, інакше тільки перший. +- Метод `regexp.test(str)` повертає `true`, якщо є хоч один збіг, інакше `false`.