Skip to content

Commit aaba2b1

Browse files
committed
Translated article alternation
1 parent b994a39 commit aaba2b1

File tree

9 files changed

+97
-97
lines changed

9 files changed

+97
-97
lines changed

9-regular-expressions/13-regexp-alternation/01-find-programming-language/solution.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

2-
The first idea can be to list the languages with `|` in-between.
2+
Перше, що може прийти на думку - перерахувати мови, розділивши їх за допомогою `|`.
33

4-
But that doesn't work right:
4+
Однак, це не спрацює так, як нам потрібно:
55

66
```js run
77
let regexp = /Java|JavaScript|PHP|C|C\+\+/g;
@@ -11,18 +11,18 @@ let str = "Java, JavaScript, PHP, C, C++";
1111
alert( str.match(regexp) ); // Java,Java,PHP,C,C
1212
```
1313

14-
The regular expression engine looks for alternations one-by-one. That is: first it checks if we have `match:Java`, otherwise -- looks for `match:JavaScript` and so on.
14+
Механізм регулярних виразів шукає альтернації одну за одною. Тобто, спочатку він перевіряє, чи маємо ми `match:Java`, якщо немає -- шукає `match:JavaScript` і так далі.
1515

16-
As a result, `match:JavaScript` can never be found, just because `match:Java` is checked first.
16+
У результаті, `match:JavaScript` ніколи не буде знайден, лише тому що `match:Java` перевіряється першою.
1717

18-
The same with `match:C` and `match:C++`.
18+
Так само і з мовами `match:C` та `match:C++`.
1919

20-
There are two solutions for that problem:
20+
Існує два розв'язання цієї проблеми:
2121

22-
1. Change the order to check the longer match first: `pattern:JavaScript|Java|C\+\+|C|PHP`.
23-
2. Merge variants with the same start: `pattern:Java(Script)?|C(\+\+)?|PHP`.
22+
1. Змінити порядок, щоб спочатку перевірялись довші співпадіння: `pattern:JavaScript|Java|C\+\+|C|PHP`.
23+
2. З'єднати варіанти, які починаються однаково: `pattern:Java(Script)?|C(\+\+)?|PHP`.
2424

25-
In action:
25+
У дії:
2626

2727
```js run
2828
let regexp = /Java(Script)?|C(\+\+)?|PHP/g;

9-regular-expressions/13-regexp-alternation/01-find-programming-language/task.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
# Find programming languages
1+
# Знайдіть мову програмування
22

3-
There are many programming languages, for instance Java, JavaScript, PHP, C, C++.
3+
Існує багато мов програмування, наприклад Java, JavaScript, PHP, C, C++.
44

5-
Create a regexp that finds them in the string `subject:Java JavaScript PHP C++ C`:
5+
Напишіть регулярний вираз, який знаходить вищезгадані мови у рядку `subject:Java JavaScript PHP C++ C`:
66

77
```js
88
let regexp = /your regexp/g;

9-regular-expressions/13-regexp-alternation/02-find-matching-bbtags/solution.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11

2-
Opening tag is `pattern:\[(b|url|quote)]`.
2+
Відкриваючий тег - це `pattern:\[(b|url|quote)]`.
33

4-
Then to find everything till the closing tag -- let's use the pattern `pattern:.*?` with flag `pattern:s` to match any character including the newline and then add a backreference to the closing tag.
4+
Потім, щоб знайти все, до закриваючого тегу -- використаємо вираз `pattern:.*?` з прапорцем `pattern:s` щоб знайти будь-які символи, включно з новим рядком, а потім додати зворотне посилання до закриваючого тегу.
55

6-
The full pattern: `pattern:\[(b|url|quote)\].*?\[/\1]`.
6+
Цілий вираз: `pattern:\[(b|url|quote)\].*?\[/\1]`.
77

8-
In action:
8+
У дії:
99

1010
```js run
1111
let regexp = /\[(b|url|quote)].*?\[\/\1]/gs;
@@ -20,4 +20,4 @@ let str = `
2020
alert( str.match(regexp) ); // [b]hello![/b],[quote][url]http://google.com[/url][/quote]
2121
```
2222

23-
Please note that besides escaping `pattern:[`, we had to escape a slash for the closing tag `pattern:[\/\1]`, because normally the slash closes the pattern.
23+
Зверніть увагу, що крім екранування `pattern:[`, нам необхідно екранувати слеш у закриваючому тегу `pattern:[\/\1]`, бо зазвичай слеш завершує вираз.

9-regular-expressions/13-regexp-alternation/02-find-matching-bbtags/task.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,47 @@
1-
# Find bbtag pairs
1+
# Знайдіть пари ВВ-кодів
22

3-
A "bb-tag" looks like `[tag]...[/tag]`, where `tag` is one of: `b`, `url` or `quote`.
3+
ВВ-код має вигляд `[tag]...[/tag]`, де `tag` - це один з: `b`, `url` або `quote`.
44

5-
For instance:
5+
Наприклад:
66
```
7-
[b]text[/b]
7+
[b]текст[/b]
88
[url]http://google.com[/url]
99
```
1010

11-
BB-tags can be nested. But a tag can't be nested into itself, for instance:
11+
ВВ-коди можуть бути вкладеними. Але тег не може бути вкладеним сам у себе, наприклад:
1212

1313
```
14-
Normal:
14+
Може бути:
1515
[url] [b]http://google.com[/b] [/url]
16-
[quote] [b]text[/b] [/quote]
16+
[quote] [b]текст[/b] [/quote]
1717
18-
Can't happen:
18+
Не може бути:
1919
[b][b]text[/b][/b]
2020
```
2121

22-
Tags can contain line breaks, that's normal:
22+
Теги можуть мати розрив рядків, це допустимо:
2323

2424
```
2525
[quote]
26-
[b]text[/b]
26+
[b]текст[/b]
2727
[/quote]
2828
```
2929

30-
Create a regexp to find all BB-tags with their contents.
30+
Створіть регулярний вираз для пошуку всіх BB-кодів та їх вмісту.
3131

32-
For instance:
32+
Наприклад:
3333

3434
```js
35-
let regexp = /your regexp/flags;
35+
let regexp = /ваш регулярний вираз/прапорець;
3636

3737
let str = "..[url]http://google.com[/url]..";
3838
alert( str.match(regexp) ); // [url]http://google.com[/url]
3939
```
4040

41-
If tags are nested, then we need the outer tag (if we want we can continue the search in its content):
41+
Якщо теки вкладені, тоді необхідно шукати зовнішній тег (за бажанням, можна продовжити пошук у його вмісті):
4242

4343
```js
44-
let regexp = /your regexp/flags;
44+
let regexp = /ваш регулярний вираз/прапорець;
4545

4646
let str = "..[url][b]http://google.com[/b][/url]..";
4747
alert( str.match(regexp) ); // [url][b]http://google.com[/b][/url]
Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
The solution: `pattern:/"(\\.|[^"\\])*"/g`.
1+
Вирішення: `pattern:/"(\\.|[^"\\])*"/g`.
22

3-
Step by step:
3+
Крок за кроком:
44

5-
- First we look for an opening quote `pattern:"`
6-
- Then if we have a backslash `pattern:\\` (we have to double it in the pattern because it is a special character), then any character is fine after it (a dot).
7-
- Otherwise we take any character except a quote (that would mean the end of the string) and a backslash (to prevent lonely backslashes, the backslash is only used with some other symbol after it): `pattern:[^"\\]`
8-
- ...And so on till the closing quote.
5+
- Спочатку шукаємо відкриваючі лапки `pattern:"`
6+
- Потім, якщо є зворотній слеш `pattern:\\` (ми повинні подвоїти його у виразі, тому що це спеціальний символ), то після нього також підійде будь-який символ (крапка).
7+
- В іншому випадку, беремо будь-який символ, крім лапок (це означало б кінець рядка) та зворотнього слешу (щоб запобігти поодиноким зворотнім слешам, бо вони використовуються тільки з іншими символами після них): `pattern:[^"\\]`
8+
- ...І так далі, до закриваючих лапок.
99

10-
In action:
10+
У дії:
1111

1212
```js run
1313
let regexp = /"(\\.|[^"\\])*"/g;
14-
let str = ' .. "test me" .. "Say \\"Hello\\"!" .. "\\\\ \\"" .. ';
14+
let str = ' .. "протестуй мене" .. "Скажи \\"Привіт\\"!" .. "\\\\ \\"" .. ';
1515

16-
alert( str.match(regexp) ); // "test me","Say \"Hello\"!","\\ \""
16+
alert( str.match(regexp) ); // "протестуй мене","Скажи \"Привіт\"!","\\ \""
1717
```
Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
1-
# Find quoted strings
1+
# Знайдіть рядки у лапках
22

3-
Create a regexp to find strings in double quotes `subject:"..."`.
3+
Створіть регулярний вираз для пошуку рядків у подвійних лапках `subject:"..."`.
44

5-
The strings should support escaping, the same way as JavaScript strings do. For instance, quotes can be inserted as `subject:\"` a newline as `subject:\n`, and the slash itself as `subject:\\`.
5+
Рядки повинні підтримувати екранування за допомогою зворотнього слеша, аналогічно з рядками в JavaScript. Наприклад, лапки можуть бути вставлені як `subject:\"`, новий рядок як `subject:\n`, та сам зворотній слеш як `subject:\\`.
66

77
```js
8-
let str = "Just like \"here\".";
8+
let str = "Як ось \"тут\".";
99
```
1010

11-
Please note, in particular, that an escaped quote `subject:\"` does not end a string.
11+
Зокрема, зверніть увагу, що екрановані лапки `subject:\"` не завершують рядок.
1212

13-
So we should search from one quote to the other ignoring escaped quotes on the way.
13+
Тому нам необхідно шукати від одних лапок до інших, ігноруючи екрановані лапки на нашому шляху.
1414

15-
That's the essential part of the task, otherwise it would be trivial.
15+
У цьому і полягає основна складність завдання, адже без цієї умови - вирішення було б елементарним.
1616

17-
Examples of strings to match:
17+
Приклади відповідних рядків:
1818
```js
19-
.. *!*"test me"*/!* ..
20-
.. *!*"Say \"Hello\"!"*/!* ... (escaped quotes inside)
21-
.. *!*"\\"*/!* .. (double slash inside)
22-
.. *!*"\\ \""*/!* .. (double slash and an escaped quote inside)
19+
.. *!*"протестуй мене"*/!* ..
20+
.. *!*"Скажи \"Привіт\"!"*/!* ... (екрановані рядки всередині)
21+
.. *!*"\\"*/!* .. (подвійний слеш всередині)
22+
.. *!*"\\ \""*/!* .. (подвійний слеш та екрановані лапки всередині)
2323
```
2424

25-
In JavaScript we need to double the slashes to pass them right into the string, like this:
25+
У JavaScript нам потрібно подвоювати слеші, щоб передати їх в рядок, як тут:
2626

2727
```js run
28-
let str = ' .. "test me" .. "Say \\"Hello\\"!" .. "\\\\ \\"" .. ';
28+
let str = ' .. "протестуй мене" .. "Скажи \\"Привіт\\"!" .. "\\\\ \\"" .. ';
2929

30-
// the in-memory string
31-
alert(str); // .. "test me" .. "Say \"Hello\"!" .. "\\ \"" ..
30+
// Рядок у пам'яті
31+
alert(str); // .. "протестуй мене" .. "Скажи \"Привіт\"!" .. "\\ \"" ..
3232
```

9-regular-expressions/13-regexp-alternation/04-match-exact-tag/solution.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11

2-
The pattern start is obvious: `pattern:<style`.
2+
Початок шаблону є очевидним: `pattern:<style`.
33

4-
...But then we can't simply write `pattern:<style.*?>`, because `match:<styler>` would match it.
4+
...Однак далі, ми не можемо просто прописати `pattern:<style.*?>`, тому що `match:<styler>` відповідає цьому виразу.
55

6-
We need either a space after `match:<style` and then optionally something else or the ending `match:>`.
6+
Потім, після `match:<style` має бути або пробіл, за яким може бути ще щось, або закриття тегу `match:>`.
77

8-
In the regexp language: `pattern:<style(>|\s.*?>)`.
8+
Мовою регулярних виразів: `pattern:<style(>|\s.*?>)`.
99

10-
In action:
10+
У дії:
1111

1212
```js run
1313
let regexp = /<style(>|\s.*?>)/g;
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
# Find the full tag
1+
# Знайдіть цілий тег
22

3-
Write a regexp to find the tag `<style...>`. It should match the full tag: it may have no attributes `<style>` or have several of them `<style type="..." id="...">`.
3+
Напишіть регулярний вираз, який шукає тег `<style...>`. Шаблон має шукати цілий тег: він може як і не мати атрибутів `<style>`, так і мати їх декілька `<style type="..." id="...">`.
44

5-
...But the regexp should not match `<styler>`!
5+
...Проте регулярний вираз не повинен знаходити `<styler>`!
66

7-
For instance:
7+
Наприклад:
88

99
```js
10-
let regexp = /your regexp/g;
10+
let regexp = /ваш регулярний вираз/g;
1111

1212
alert( '<style> <styler> <style test="...">'.match(regexp) ); // <style>, <style test="...">
1313
```

9-regular-expressions/13-regexp-alternation/article.md

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,67 @@
1-
# Alternation (OR) |
1+
# Альтернація (АБО) |
22

3-
Alternation is the term in regular expression that is actually a simple "OR".
3+
Альтернація - це термін у регулярному виразі, який насправді є простим "АБО".
44

5-
In a regular expression it is denoted with a vertical line character `pattern:|`.
5+
Вона позначається символом вертикальної лінії `pattern:|`.
66

7-
For instance, we need to find programming languages: HTML, PHP, Java or JavaScript.
7+
Наприклад, нам треба знайти мови програмування: HTML, PHP, Java або JavaScript.
88

9-
The corresponding regexp: `pattern:html|php|java(script)?`.
9+
Відповідний регулярний вираз: `pattern:html|php|java(script)?`.
1010

11-
A usage example:
11+
Приклад використання:
1212

1313
```js run
1414
let regexp = /html|php|css|java(script)?/gi;
1515

16-
let str = "First HTML appeared, then CSS, then JavaScript";
16+
let str = "Першим з'явився HTML, потім CSS, далі JavaScript";
1717

1818
alert( str.match(regexp) ); // 'HTML', 'CSS', 'JavaScript'
1919
```
2020

21-
We already saw a similar thing -- square brackets. They allow to choose between multiple characters, for instance `pattern:gr[ae]y` matches `match:gray` or `match:grey`.
21+
Ми вже бачили подібне -- квадратні дужки. Вони дозволяють обирати між декількома символами, наприклад `pattern:gr[ae]y` знайде `match:gray` або `match:grey`.
2222

23-
Square brackets allow only characters or character classes. Alternation allows any expressions. A regexp `pattern:A|B|C` means one of expressions `A`, `B` or `C`.
23+
Квадратні дужки дозволяють працювати тільки з символами, або наборами символів. Натомість Альтернація працює з будь-якими виразами. Регулярний вираз `pattern:A|B|C` означає пошук одного з символів: `A`, `B` або `C`.
2424

25-
For instance:
25+
Наприклад:
2626

27-
- `pattern:gr(a|e)y` means exactly the same as `pattern:gr[ae]y`.
28-
- `pattern:gra|ey` means `match:gra` or `match:ey`.
27+
- `pattern:gr(a|e)y` означає те саме, що і `pattern:gr[ae]y`.
28+
- `pattern:gra|ey` означає `match:gra` або `match:ey`.
2929

30-
To apply alternation to a chosen part of the pattern, we can enclose it in parentheses:
31-
- `pattern:I love HTML|CSS` matches `match:I love HTML` or `match:CSS`.
32-
- `pattern:I love (HTML|CSS)` matches `match:I love HTML` or `match:I love CSS`.
30+
Для того, щоб використати альтернацію до обраної частини шаблону, ми можемо загорнути його у дужки:
31+
- `pattern:Я люблю HTML|CSS` знайде `match:Я люблю HTML` або `match:CSS`.
32+
- `pattern:Я люблю (HTML|CSS)` знайде `match:Я люблю HTML` або `match:Я люблю CSS`.
3333

34-
## Example: regexp for time
34+
## Приклад: регулярний вираз для часу
3535

36-
In previous articles there was a task to build a regexp for searching time in the form `hh:mm`, for instance `12:00`. But a simple `pattern:\d\d:\d\d` is too vague. It accepts `25:99` as the time (as 99 minutes match the pattern, but that time is invalid).
36+
У попередніх главах було завдання написати регулярний вираз для пошуку часу у форматі `гг:хх`, наприклад `12:00`. Однак простий шаблон `pattern:\d\d:\d\d` недостатньо точний. Він приймає `25:99` як час (99 хвилин підходять до шаблону, однак цей час не є вірним).
3737

38-
How can we make a better pattern?
38+
Як ми можемо написати кращий шаблон?
3939

40-
We can use more careful matching. First, the hours:
40+
Можна зробити більш ретельне порівняння. Спочатку, години:
4141

42-
- If the first digit is `0` or `1`, then the next digit can be any: `pattern:[01]\d`.
43-
- Otherwise, if the first digit is `2`, then the next must be `pattern:[0-3]`.
44-
- (no other first digit is allowed)
42+
- Якщо перша цифра `0` або `1`, тоді наступна може бути будь-якою цифрою: `pattern:[01]\d`.
43+
- В іншому випадку, якщо перша цифра `2`, тоді наступна має бути від 0 до 3 `pattern:[0-3]`.
44+
- (іншої першої цифри не може бути)
4545

46-
We can write both variants in a regexp using alternation: `pattern:[01]\d|2[0-3]`.
46+
Ми можемо написати обидва варіанти у регулярному виразі за допомогою альтернації: `pattern:[01]\d|2[0-3]`.
4747

48-
Next, minutes must be from `00` to `59`. In the regular expression language that can be written as `pattern:[0-5]\d`: the first digit `0-5`, and then any digit.
48+
Далі, хвилини мають бути від `00` до `59`. Мовою регулярних виразів це може бути написано таким чином `pattern:[0-5]\d`: перша цифра `0-5`, а за нею будь-яка.
4949

50-
If we glue hours and minutes together, we get the pattern: `pattern:[01]\d|2[0-3]:[0-5]\d`.
50+
Якщо ми зберемо шаблони годин та хвилин докупи, то вийде ось так: `pattern:[01]\d|2[0-3]:[0-5]\d`.
5151

52-
We're almost done, but there's a problem. The alternation `pattern:|` now happens to be between `pattern:[01]\d` and `pattern:2[0-3]:[0-5]\d`.
52+
Майже готово, однак тут є проблема. Альтернація `pattern:|` зараз відбувається між `pattern:[01]\d` та `pattern:2[0-3]:[0-5]\d`.
5353

54-
That is: minutes are added to the second alternation variant, here's a clear picture:
54+
Тобто: хвилини додалися до другого варіанту альтернації, більш наочна картинка:
5555

5656
```
5757
[01]\d | 2[0-3]:[0-5]\d
5858
```
5959

60-
That pattern looks for `pattern:[01]\d` or `pattern:2[0-3]:[0-5]\d`.
60+
Такий шаблон буде шукати `pattern:[01]\d` або `pattern:2[0-3]:[0-5]\d`.
6161

62-
But that's wrong, the alternation should only be used in the "hours" part of the regular expression, to allow `pattern:[01]\d` OR `pattern:2[0-3]`. Let's correct that by enclosing "hours" into parentheses: `pattern:([01]\d|2[0-3]):[0-5]\d`.
62+
Але це невірно. Нам необхідно, щоб альтернація використовувалась тільки у частині регулярного виразу, який відноситься до "годин", щоб дозволити `pattern:[01]\d` АБО `pattern:2[0-3]`. Виправимо це, огорнувши "години" у дужки: `pattern:([01]\d|2[0-3]):[0-5]\d`.
6363

64-
The final solution:
64+
Остаточне рішення:
6565

6666
```js run
6767
let regexp = /([01]\d|2[0-3]):[0-5]\d/g;

0 commit comments

Comments
 (0)