Альтернація – це термін у регулярному виразі, який насправді є простим “АБО”.
Вона позначається символом вертикальної лінії |.
Наприклад, нам треба знайти мови програмування: 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
Коментарі
<code>, для кількох рядків – обгорніть їх тегом<pre>, для понад 10 рядків – використовуйте пісочницю (plnkr, jsbin, codepen…)