#регулярные_выражения #строки #любой_язык
Нужно сделать регулярное выражение для проверки строки, обозначающей версию приложения. Строка имеет вид 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
Комментариев нет:
Отправить комментарий