From 90552730213bae0da1e6fcc3a322fe3bafbf66fb Mon Sep 17 00:00:00 2001 From: Tetiana Aleksina <73138862+taleksina@users.noreply.github.com> Date: Tue, 12 Sep 2023 14:35:37 +0300 Subject: [PATCH 01/14] Update witch_greedy1.svg --- .../10-regexp-greedy-and-lazy/witch_greedy1.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy1.svg b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy1.svg index d911ece21..f7354727d 100644 --- a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy1.svg +++ b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy1.svg @@ -1 +1 @@ -a "witch" and her "broom" is one \ No newline at end of file +я "мавка" ліс моє "єство" та дух From 517e5662c25bed249cf13cea4ef358a954062cc5 Mon Sep 17 00:00:00 2001 From: Tetiana Aleksina <73138862+taleksina@users.noreply.github.com> Date: Tue, 12 Sep 2023 14:39:53 +0300 Subject: [PATCH 02/14] Update witch_greedy2.svg --- .../10-regexp-greedy-and-lazy/witch_greedy2.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy2.svg b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy2.svg index f821c6d8c..4ff1d50f6 100644 --- a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy2.svg +++ b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy2.svg @@ -1 +1 @@ -a "witch" and her "broom" is one \ No newline at end of file +я "мавка" ліс моє "єство" та дух From 5933c2351ea32351be101d370dab8c2e800dea2b Mon Sep 17 00:00:00 2001 From: Tetiana Aleksina <73138862+taleksina@users.noreply.github.com> Date: Tue, 12 Sep 2023 14:43:52 +0300 Subject: [PATCH 03/14] Update witch_greedy3.svg --- .../10-regexp-greedy-and-lazy/witch_greedy3.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy3.svg b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy3.svg index 9509882b2..83bbab389 100644 --- a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy3.svg +++ b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy3.svg @@ -1 +1 @@ -a "witch" and her "broom" is one \ No newline at end of file +я "мавка" ліс моє "єство" та дух From 4a33376b78f7619e1d4dc0461a9715fc9623a50c Mon Sep 17 00:00:00 2001 From: Tetiana Aleksina <73138862+taleksina@users.noreply.github.com> Date: Tue, 12 Sep 2023 15:04:29 +0300 Subject: [PATCH 04/14] Update witch_greedy4.svg --- .../10-regexp-greedy-and-lazy/witch_greedy4.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy4.svg b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy4.svg index 8c5532b9f..ca3f5a568 100644 --- a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy4.svg +++ b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy4.svg @@ -1 +1 @@ -a "witch" and her "broom" is one \ No newline at end of file +я "мавка" ліс моє "єство" та дух From 7227443bdbbc4b4ceb4db97356ea4c1415cbd201 Mon Sep 17 00:00:00 2001 From: Tetiana Aleksina <73138862+taleksina@users.noreply.github.com> Date: Tue, 12 Sep 2023 15:06:03 +0300 Subject: [PATCH 05/14] Update witch_greedy5.svg --- .../10-regexp-greedy-and-lazy/witch_greedy5.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy5.svg b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy5.svg index 29cb0c533..0206f7927 100644 --- a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy5.svg +++ b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy5.svg @@ -1 +1 @@ -a "witch" and her "broom" is one \ No newline at end of file +я "мавка" ліс моє "єство" та дух From 8d2be4087378186b4fd358d835e34fd7a4e046a7 Mon Sep 17 00:00:00 2001 From: Tetiana Aleksina <73138862+taleksina@users.noreply.github.com> Date: Tue, 12 Sep 2023 15:08:02 +0300 Subject: [PATCH 06/14] Update witch_greedy6.svg --- .../10-regexp-greedy-and-lazy/witch_greedy6.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy6.svg b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy6.svg index 9f4b78b07..60bb4a42b 100644 --- a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy6.svg +++ b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_greedy6.svg @@ -1 +1 @@ -a "witch" and her "broom" is one \ No newline at end of file +я "мавка" ліс моє "єство" та дух From cb7597230d34221d5dedc95c0a6d60625af3c41b Mon Sep 17 00:00:00 2001 From: Tetiana Aleksina <73138862+taleksina@users.noreply.github.com> Date: Tue, 12 Sep 2023 15:14:24 +0300 Subject: [PATCH 07/14] Update witch_lazy3.svg --- 9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy3.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy3.svg b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy3.svg index 06b2b5f17..2353c0369 100644 --- a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy3.svg +++ b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy3.svg @@ -1 +1 @@ -a "witch" and her "broom" is one \ No newline at end of file +я "мавка" ліс моє "єство" та дух From c98a84b9d2fbb0c528a88df94d1f91e40076ae61 Mon Sep 17 00:00:00 2001 From: Tetiana Aleksina <73138862+taleksina@users.noreply.github.com> Date: Tue, 12 Sep 2023 15:22:34 +0300 Subject: [PATCH 08/14] Update witch_lazy4.svg --- 9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy4.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy4.svg b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy4.svg index 60a09b565..3c358b6ed 100644 --- a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy4.svg +++ b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy4.svg @@ -1 +1 @@ -a "witch" and her "broom" is one \ No newline at end of file +я "мавка" ліс моє "єство" та дух From 876e150a02c92645f46d3c124866fe47aa62ef5a Mon Sep 17 00:00:00 2001 From: Tetiana Aleksina <73138862+taleksina@users.noreply.github.com> Date: Tue, 12 Sep 2023 15:26:16 +0300 Subject: [PATCH 09/14] Update witch_lazy4.svg --- 9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy4.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy4.svg b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy4.svg index 3c358b6ed..a15d7cbdf 100644 --- a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy4.svg +++ b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy4.svg @@ -1 +1 @@ -я "мавка" ліс моє "єство" та дух +я "мавка" ліс моє "єство" та дух From 65ee4c238fb4639b22a099323d74e162b184a453 Mon Sep 17 00:00:00 2001 From: Tetiana Aleksina <73138862+taleksina@users.noreply.github.com> Date: Tue, 12 Sep 2023 15:28:18 +0300 Subject: [PATCH 10/14] Update witch_lazy5.svg --- 9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy5.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy5.svg b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy5.svg index cec5b5d7c..f8e86ea12 100644 --- a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy5.svg +++ b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy5.svg @@ -1 +1 @@ -a "witch" and her "broom" is one \ No newline at end of file +я "мавка" ліс моє "єство" та дух From c2616316d4cc3f09f25a323b6e08be46703490fa Mon Sep 17 00:00:00 2001 From: Tetiana Aleksina <73138862+taleksina@users.noreply.github.com> Date: Tue, 12 Sep 2023 15:32:48 +0300 Subject: [PATCH 11/14] Update witch_lazy6.svg --- 9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy6.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy6.svg b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy6.svg index db040e558..cba395f83 100644 --- a/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy6.svg +++ b/9-regular-expressions/10-regexp-greedy-and-lazy/witch_lazy6.svg @@ -1 +1 @@ -a "witch" and her "broom" is one \ No newline at end of file +я "мавка" ліс моє "єство" та дух From d2a12f4871031ec913a34a094f0657a3c66d876d Mon Sep 17 00:00:00 2001 From: Tetiana Aleksina <73138862+taleksina@users.noreply.github.com> Date: Tue, 12 Sep 2023 16:40:30 +0300 Subject: [PATCH 12/14] Update article.md --- .../10-regexp-greedy-and-lazy/article.md | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/9-regular-expressions/10-regexp-greedy-and-lazy/article.md b/9-regular-expressions/10-regexp-greedy-and-lazy/article.md index a8929c241..2c754358e 100644 --- a/9-regular-expressions/10-regexp-greedy-and-lazy/article.md +++ b/9-regular-expressions/10-regexp-greedy-and-lazy/article.md @@ -12,21 +12,21 @@ Для початку, знайдемо рядки в лапках, аби потім їх замінити. -Регулярний вираз по типу `pattern:/".+"/g` (лапки з чимось всередині) виглядає підходящим, але це не так! +Регулярний вираз по типу `pattern:/".+"/g` (лапки з чимось всередині) виглядає придатним, але це не так! Спробуємо його на практиці: ```js run let regexp = /".+"/g; -let str = 'a "witch" and her "broom" is one'; +let str = 'я "мавка" ліс моє "єство" та дух'; -alert( str.match(regexp) ); // "witch" and her "broom" +alert( str.match(regexp) ); // "мавка" ліс моє "єство" ``` ...Як бачимо, вираз працює не так, як очікувалось! -Замість двох збігів `match:"witch"` та `match:"broom"`, він знайшов один: `match:"witch" and her "broom"`. +Замість двох збігів `match:"мавка"` та `match:"єство"`, він знайшов один: `match:"мавка" ліс моє "єство"`. Про це можна сказати "жадібність -- причина всіх бід". @@ -42,21 +42,21 @@ alert( str.match(regexp) ); // "witch" and her "broom" 1. Першим символом шаблону є одна з лапок `pattern:"`. - Рушій регулярних виразів намагається знайти його на нульовій позиції вихідного рядку `subject:a "witch" and her "broom" is one`, але бачить `subject:a`, тож вважає, що збігу немає. + Рушій регулярних виразів намагається знайти його на нульовій позиції вихідного рядка `subject:я "мавка" ліс моє "єство" та дух`, але бачить `subject:я`, тож вважає, що збігу немає. - Йдемо далі: бере наступну позицію рядку та намагається на ній знайти перший символ шаблону, знову невдача, але, нарешті, необхідний символ знаходиться на третій позиції: + Йдемо далі: бере наступну позицію рядка та намагається на ній знайти перший символ шаблону, знову невдача, але, нарешті, необхідний символ знаходиться на третій позиції: ![](witch_greedy1.svg) 2. Першу з лапок виявлено, після цього рушій намагається знайти збіг для решти шаблону. Він намагається зрозуміти, чи відповідає решта рядка `pattern:.+"`. - В нашому випадку, наступний символ шаблону -- це `pattern:.` (крапка). Він вказує на "будь-який символ, за винятком символу нового рядку", тож наступна літера рядку `match:'w'` підходить під опис: + В нашому випадку, наступний символ шаблону -- це `pattern:.` (крапка). Він вказує на "будь-який символ, за винятком символу нового рядка", тож наступна літера рядка `match:'м'` підходить під опис: ![](witch_greedy2.svg) -3. Після цього, дія крапки повторюється через наявність квантифікатору `pattern:.+`. Рушій регулярних виразів додає до збігу символи один за одним. +3. Після цього, дія крапки повторюється через наявність квантифікатора `pattern:.+`. Рушій регулярних виразів додає до збігу символи один за одним. - ...До якого моменту? Крапка приймає усі символи, таким чином зупиняючись тільки досягнувши кінця рядку: + ...До якого моменту? Крапка приймає усі символи, таким чином зупиняючись тільки досягнувши кінця рядка: ![](witch_greedy3.svg) @@ -68,15 +68,15 @@ alert( str.match(regexp) ); // "witch" and her "broom" ![](witch_greedy4.svg) - Після цього, рушій припускає, що `pattern:.+` завершується одним символом раніше кінця рядку та намагається знайти збіг для решти шаблону, починаючи з тієї позиції. + Після цього, рушій припускає, що `pattern:.+` завершується одним символом раніше кінця рядка та намагається знайти збіг для решти шаблону, починаючи з тієї позиції. - Якби друга з лапок була на цьому місці, то пошук завершився б, але останній символ `subject:'e'` не відповідає цілі пошуку. + Якби друга з лапок була на цьому місці, то пошук завершився б, але останній символ `subject:'х'` не відповідає цілі пошуку. 5. ...Тому рушій зменшує кількість повторів `pattern:.+` на ще один символ: ![](witch_greedy5.svg) - Друга закриваюча лапка `pattern:'"'` не співпадає з `subject:'n'`. + Друга закриваюча лапка `pattern:'"'` не збігається з `subject:'у'`. 6. Рушій продовжує процес повернення: число повторів `pattern:'.'` зменшується доти, доки решта шаблону (в цьому випадку, `pattern:'"'`) не збігається: @@ -84,7 +84,7 @@ alert( str.match(regexp) ); // "witch" and her "broom" 7. Збіг знайдено. -8. Отож, першим збігом буде:"witch" and her "broom"`. Якщо регулярний вираз має прапорець `pattern:g`, тоді пошук продовжиться з кінця першого збігу. Решта рядку `subject:is one` не містить лапок, тож інших збігів не буде. +8. Отож, першим збігом буде: `"мавка" ліс моє "єство"`. Якщо регулярний вираз має прапорець `pattern:g`, тоді пошук продовжиться з кінця першого збігу. Решта рядка `subject:та дух` не містить лапок, тож інших збігів не буде. Напевно, це не те, чого ми очікували, але так вже воно працює. @@ -92,7 +92,7 @@ alert( str.match(regexp) ); // "witch" and her "broom" Рушій регулярного виразу додає до збігу всі можливі символи для `pattern:.+`, а потім зменшує результат посимвольно, якщо решта шаблону не збігається. -Наша задача потребує іншого підходу. Тут може стати в нагоді лінивий режим. +Наша задача потребує іншого підходу. Тут може стати в пригоді лінивий режим. ## Лінивий режим @@ -102,17 +102,17 @@ alert( str.match(regexp) ); // "witch" and her "broom" Пояснимо кілька моментів: зазвичай, знак питання `pattern:?` сам по собі є квантифікатором (0 чи 1), але змінює значення, якщо його додати *після іншого квантифікатора (або навіть самого себе)* -- він змінює режим пошуку з жадібного на лінивий. -Регулярний вираз `pattern:/".+?"/g` працюватиме, як потрібно: він знайде `match:"witch"` та `match:"broom"`: +Регулярний вираз `pattern:/".+?"/g` працюватиме, як потрібно: він знайде `match:"мавка"` та `match:"єство"`: ```js run let regexp = /".+?"/g; -let str = 'a "witch" and her "broom" is one'; +let str = 'я "мавка" ліс моє "єство" та дух'; -alert( str.match(regexp) ); // "witch", "broom" +alert( str.match(regexp) ); // "мавка", "єство" ``` -Аби чітко побачити різницю, відслідкуємо процес пошуку покроково. +Аби чітко побачити різницю, простежимо процес пошуку покроково. 1. Перший крок той самий: знаходимо початок шаблону `pattern:'"'` на третій позиції: @@ -126,7 +126,7 @@ alert( str.match(regexp) ); // "witch", "broom" ![](witch_lazy3.svg) - Якби на цьому місці була остання з лапок, тоді пошук закінчився б, але бачимо `'i'`, тож збігу немає. + Якби на цьому місці була остання з лапок, тоді пошук закінчився б, але бачимо `'а'`, тож збігу немає. 4. Далі, рушій регулярних виразів збільшує кількість повторів для крапки та ще раз проводить пошук: ![](witch_lazy4.svg) @@ -177,9 +177,9 @@ alert( "123 456".match(/\d+ \d+?/) ); // 123 4 ```js run let regexp = /"[^"]+"/g; -let str = 'a "witch" and her "broom" is one'; +let str = 'я "мавка" ліс моє "єство" та дух'; -alert( str.match(regexp) ); // "witch", "broom" +alert( str.match(regexp) ); // "мавка", "єство" ``` Регулярний вираз `pattern:"[^"]+"` дає правильні результати, бо шукає першу з лапок `pattern:'"'`, за якою слідують один чи більше символів (не лапок) `pattern:[^"]` та друга з лапок в кінці. @@ -217,7 +217,7 @@ let regexp = //g; alert( str.match(regexp) ); // ... ``` -Тепер результат неправильний з тієї ж причини, що й у прикладі про "witches". Квантифікатор `pattern:.*` бере забагато символів. +Тепер результат неправильний з тієї ж причини, що й у прикладі про "мавку". Квантифікатор `pattern:.*` бере забагато символів. Збіг виглядає наступним чином: @@ -293,7 +293,7 @@ alert( str2.match(regexp) ); // , Date: Wed, 13 Sep 2023 13:43:46 +0300 Subject: [PATCH 13/14] Update article.md --- 1-js/03-code-quality/05-testing-mocha/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/03-code-quality/05-testing-mocha/article.md b/1-js/03-code-quality/05-testing-mocha/article.md index efe815dfc..1842a87f0 100644 --- a/1-js/03-code-quality/05-testing-mocha/article.md +++ b/1-js/03-code-quality/05-testing-mocha/article.md @@ -57,7 +57,7 @@ describe("pow", function() { : У першому аргументі (назві) `it` ми описуємо *людською мовою* конкретний спосіб використання функції, а у другому аргументі пишемо функцію, яка тестуватиме цей спосіб. `assert.equal(value1, value2)` -: Код, всереді блоку `it`, якщо реалізація правильна, повинен виконуватись без помилок. +: Код, всередині блоку `it`, якщо реалізація правильна, повинен виконуватись без помилок. Функції `assert.*` використовуються для перевірки того, що функція `pow` працює, як ми очікуємо. В нашому випадку, ми використовуємо одну з них -- `assert.equal`, вона порівнює аргументи і сповіщає про помилку, якщо вони відрізняються. Тут вона перевіряє, що результат `pow(2, 3)` дорівнює `8`. Є також інші способи порівняння та перевірки, які ми розглянемо пізніше. From aa0709ef4dd5b06b9c223e49827815239337d4a9 Mon Sep 17 00:00:00 2001 From: Tetiana Aleksina <73138862+taleksina@users.noreply.github.com> Date: Thu, 9 May 2024 12:10:26 +0300 Subject: [PATCH 14/14] Update article.md --- 1-js/03-code-quality/05-testing-mocha/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/03-code-quality/05-testing-mocha/article.md b/1-js/03-code-quality/05-testing-mocha/article.md index 1842a87f0..efe815dfc 100644 --- a/1-js/03-code-quality/05-testing-mocha/article.md +++ b/1-js/03-code-quality/05-testing-mocha/article.md @@ -57,7 +57,7 @@ describe("pow", function() { : У першому аргументі (назві) `it` ми описуємо *людською мовою* конкретний спосіб використання функції, а у другому аргументі пишемо функцію, яка тестуватиме цей спосіб. `assert.equal(value1, value2)` -: Код, всередині блоку `it`, якщо реалізація правильна, повинен виконуватись без помилок. +: Код, всереді блоку `it`, якщо реалізація правильна, повинен виконуватись без помилок. Функції `assert.*` використовуються для перевірки того, що функція `pow` працює, як ми очікуємо. В нашому випадку, ми використовуємо одну з них -- `assert.equal`, вона порівнює аргументи і сповіщає про помилку, якщо вони відрізняються. Тут вона перевіряє, що результат `pow(2, 3)` дорівнює `8`. Є також інші способи порівняння та перевірки, які ми розглянемо пізніше.