Альтернация – термин в регулярных выражениях, которому в русском языке соответствует слово «ИЛИ».
В регулярных выражениях она обозначается символом вертикальной черты |.
Например, нам нужно найти языки программирования: HTML, PHP, Java и JavaScript.
Соответствующее регулярное выражение: html|php|java(script)?.
Пример использования:
let regexp = /html|css|java(script)?/gi;
let str = "Сначала появился язык Java, затем HTML, потом JavaScript";
alert( str.match(regexp) ); // Java,HTML,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:2[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…)