|
1 |
| -# Alternation (OR) | |
| 1 | +# Альтернація (АБО) | |
2 | 2 |
|
3 |
| -Alternation is the term in regular expression that is actually a simple "OR". |
| 3 | +Альтернація - це термін у регулярному виразі, який насправді є простим "АБО". |
4 | 4 |
|
5 |
| -In a regular expression it is denoted with a vertical line character `pattern:|`. |
| 5 | +Вона позначається символом вертикальної лінії `pattern:|`. |
6 | 6 |
|
7 |
| -For instance, we need to find programming languages: HTML, PHP, Java or JavaScript. |
| 7 | +Наприклад, нам треба знайти мови програмування: HTML, PHP, Java або JavaScript. |
8 | 8 |
|
9 |
| -The corresponding regexp: `pattern:html|php|java(script)?`. |
| 9 | +Відповідний регулярний вираз: `pattern:html|php|java(script)?`. |
10 | 10 |
|
11 |
| -A usage example: |
| 11 | +Приклад використання: |
12 | 12 |
|
13 | 13 | ```js run
|
14 | 14 | let regexp = /html|php|css|java(script)?/gi;
|
15 | 15 |
|
16 |
| -let str = "First HTML appeared, then CSS, then JavaScript"; |
| 16 | +let str = "Першим з'явився HTML, потім CSS, далі JavaScript"; |
17 | 17 |
|
18 | 18 | alert( str.match(regexp) ); // 'HTML', 'CSS', 'JavaScript'
|
19 | 19 | ```
|
20 | 20 |
|
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`. |
22 | 22 |
|
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`. |
24 | 24 |
|
25 |
| -For instance: |
| 25 | +Наприклад: |
26 | 26 |
|
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`. |
29 | 29 |
|
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`. |
33 | 33 |
|
34 |
| -## Example: regexp for time |
| 34 | +## Приклад: регулярний вираз для часу |
35 | 35 |
|
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 хвилин підходять до шаблону, однак цей час не є вірним). |
37 | 37 |
|
38 |
| -How can we make a better pattern? |
| 38 | +Як ми можемо написати кращий шаблон? |
39 | 39 |
|
40 |
| -We can use more careful matching. First, the hours: |
| 40 | +Можна зробити більш ретельне порівняння. Спочатку, години: |
41 | 41 |
|
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 | +- (іншої першої цифри не може бути) |
45 | 45 |
|
46 |
| -We can write both variants in a regexp using alternation: `pattern:[01]\d|2[0-3]`. |
| 46 | +Ми можемо написати обидва варіанти у регулярному виразі за допомогою альтернації: `pattern:[01]\d|2[0-3]`. |
47 | 47 |
|
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`, а за нею будь-яка. |
49 | 49 |
|
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`. |
51 | 51 |
|
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`. |
53 | 53 |
|
54 |
| -That is: minutes are added to the second alternation variant, here's a clear picture: |
| 54 | +Тобто: хвилини додалися до другого варіанту альтернації, більш наочна картинка: |
55 | 55 |
|
56 | 56 | ```
|
57 | 57 | [01]\d | 2[0-3]:[0-5]\d
|
58 | 58 | ```
|
59 | 59 |
|
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`. |
61 | 61 |
|
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`. |
63 | 63 |
|
64 |
| -The final solution: |
| 64 | +Остаточне рішення: |
65 | 65 |
|
66 | 66 | ```js run
|
67 | 67 | let regexp = /([01]\d|2[0-3]):[0-5]\d/g;
|
|
0 commit comments