Альтернация – термин в регулярных выражениях, которому в русском языке соответствует слово «ИЛИ».
В регулярных выражениях она обозначается символом вертикальной черты |
.
Например, нам нужно найти языки программирования: 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