Альтернація – це термін у регулярному виразі, який насправді є простим “АБО”.
Вона позначається символом вертикальної лінії |
.
Наприклад, нам треба знайти мови програмування: HTML, PHP, Java або JavaScript.
Відповідний регулярний вираз: html|php|java(script)?
.
Приклад використання:
let regexp = /html|php|css|java(script)?/gi;
let str = "Першим з’явився HTML, потім CSS, далі JavaScript";
alert( str.match(regexp) ); // 'HTML', 'CSS', 'JavaScript'
Ми вже бачили подібне – квадратні дужки. Вони дозволяють обирати між декількома символами, наприклад gr[ae]y
знайде gray
або grey
.
Квадратні дужки дозволяють працювати тільки з символами, або наборами символів. Натомість Альтернація працює з будь-якими виразами. Регулярний вираз A|B|C
означає пошук одного з символів: A
, B
або C
.
Наприклад:
gr(a|e)y
означає те саме, що йgr[ae]y
.gra|ey
означаєgra
абоey
.
Для того, щоб використати альтернацію з обраною частиною шаблону, ми можемо загорнути його у дужки:
Я люблю HTML|CSS
знайдеЯ люблю HTML
абоCSS
.Я люблю (HTML|CSS)
знайдеЯ люблю HTML
абоЯ люблю CSS
.
Приклад: регулярний вираз для часу
У попередніх статтях було завдання написати регулярний вираз для пошуку часу у форматі гг:хх
, наприклад 12:00
. Однак простий шаблон \d\d:\d\d
недостатньо точний. Він приймає 25:99
як час (99 хвилин підходять до шаблону, однак цей час не є вірним).
Як ми можемо написати кращий шаблон?
Можна зробити більш ретельне порівняння. Спочатку, години:
- Якщо перша цифра
0
або1
, тоді наступна може бути будь-якою цифрою:[01]\d
. - В іншому випадку, якщо перша цифра
2
, тоді наступна має бути від 0 до 3[0-3]
. - (іншої першої цифри бути не може)
Ми можемо написати обидва варіанти у регулярному виразі за допомогою альтернації: [01]\d|2[0-3]
.
Далі, хвилини мають бути від 00
до 59
. Мовою регулярних виразів це може бути написано таким чином [0-5]\d
: перша цифра 0-5
, а за нею будь-яка.
Якщо ми зберемо шаблони годин та хвилин докупи, то вийде ось так: [01]\d|2[0-3]:[0-5]\d
.
Майже готово, однак тут є проблема. Альтернація |
зараз відбувається між [01]\d
та 2[0-3]:[0-5]\d
.
Тобто: хвилини додалися до другого варіанту альтернації, більш наочна картинка:
[01]\d | 2[0-3]:[0-5]\d
Такий шаблон буде шукати [01]\d
або 2[0-3]:[0-5]\d
.
Але це невірно. Нам необхідно, щоб альтернація використовувалась тільки у частині регулярного виразу, який відноситься до “годин”, щоб дозволити [01]\d
АБО 2[0-3]
. Виправимо це, огорнувши “години” у дужки: ([01]\d|2[0-3]):[0-5]\d
.
Остаточне рішення:
let regexp = /([01]\d|2[0-3]):[0-5]\d/g;
alert("00:00 10:10 23:59 25:99 1:2".match(regexp)); // 00:00,10:10,23:59