Страницы

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

среда, 5 февраля 2020 г.

Регулярное выражение для проверки строки версии (вроде 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.*


У меня такую регулярку сделать не вышло.

Это не учебное задание 
    


Ответы

Ответ 1



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

Ответ 2



^(0|[1-9]\d*)\.(\*|((0|[1-9]\d*)\.(\*|(0|[1-9]\d*))))$ Немного пояснений: ведущий ноль отсекаем таким выражением 0|[1-9]\d*. Т.е. разрешаем или один ноль, или цифру 1-9, а за ней любое количество любых цифр. * контролируем так \*|((0|[1-9]\d*)\.(\*|(0|[1-9]\d*))) или звездочка, или все остальное. Тест на regex101 https://regex101.com/r/41aBtQ/1

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

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