@Thehavoc

Как ограничить диапазон двузначных чисел в нетривиальном регулярном выражении?

Есть регулярное выражение, которое проверяет строку пользовательского ввода.
У каждого числа ограничение от 1 до 16.
Строка может быть с одним или несколькими поддиапазонами чисел от 1 до 16, например:
"1,3,5,7-11,15"
"1-3,5-8,12,13-16"
"1-16"
Написал регулярку, которая допускает числа от 1 до 99:

^([1-9]{0,2}((-[1-9]{0,}){0,2})(,([1-9]{0,2}((-[1-9]{0,2}){0,1}))){0,})$

но как ограничить числа от 1 до 16, не догоняю.
Может быть есть готовые применимые для данной задачи примеры?
  • Вопрос задан
  • 1278 просмотров
Решения вопроса 1
trapwalker
@trapwalker
Программист, энтузиаст
Вы можете описать регуляркой число от 1-16 так: (1[0-6])|([1-9])
Но регекспы не предназначены для условной фильтрации по выражениям.
Обычно они определяют только синтаксис и разделяют текст на группы, которые потом нужно преобразовывать к типам и проверять.
Если приспичило всё-таки, используйте мой вариант описания числа 1-16, но завтра вам потребуется определять четность, а послезавтра потребуется, чтобы правая граница интервала была вдвое больше левой... Надо где-то остановиться и где именно -- решать вам.

Вот в применении к вашему случаю:
^((1[0-6]|[1-9])(-(1[0-6]|[1-9]))?)(,((1[0-6]|[1-9])(-(1[0-6]|[1-9]))?))*$

Можете даже потестировать
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
^(1[0-6]|[1-9])(-(1[0-6]|[1-9]))?(,(1[0-6]|[1-9])(-(1[0-6]|[1-9]))?)*$


Но если результаты capturing group из RegEx затем используется для обработки текста - то эта строка не сработает, даст только первое и последнее числа.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы