Страницы

Поиск по вопросам

понедельник, 8 апреля 2019 г.

Регулярное выражение для проверки строки версии (вроде 34.0.3, 23.2.*, 4.*)

Нужно сделать регулярное выражение для проверки строки, обозначающей версию приложения. Строка имеет вид X.Y.Z, где X, Y, Z могут быть любыми целыми числами, а также * (кроме X). После символа * дальше строки быть не должно. Перед цифрами не должно быть 0. Примеры валидных строк:
12.2323.2 0.0.3 0.0.0 34.0.3 23.2.* 4.*
Примеры неверных строк:
34а.34.1 * 34.*.3 57.*. d3.43.3 0004.* 1.02.*
У меня такую регулярку сделать не вышло.
Это не учебное задание


Ответ

Наивная реализация того что вы хотите:
^(0|[1-9]\d*)\.(\*|(0|[1-9]\d*)\.(\*|(0|[1-9]\d*)))(
)?$

Я получил ее следуя таким умозаключениям. Сперва составим регулярку, проверяющую строку на соответствие шаблону A.B.C, это просто:
^\d+\.\d+\.\d+(
)?$
здесь \d+ - любая цифровая последовательность, \. - точка (надо экранировать, да), ^ - начало строки, (
)?$ - конец строки, учитывающий как
, так и просто

Далее, вместо последнего блока цифр может стоять единственная звездочка, заменяем \d+ на (\*|\d+) (звездочку тоже надо экранировать):
^\d+\.\d+\.(\*|\d+)(
)?$
Также звездочка может быть вместо последних двух блоков, аналогично предыдущему меняем \d+\.(\*|\d+) на (\*|\d+\.(\*|\d+))
^\d+\.(\*|\d+\.(\*|\d+))(
)?$
Ну и остается исключить числа с ведущими нулями, т.е. это либо отдельный ноль 0, либо не ноль + несколько любых цифр [1-9]\d*. Заменяем все три блока \d+ на конструкцию (0|[1-9]\d*), получаем окончательный вариант.

Комментариев нет:

Отправить комментарий