Это регулярное выражение должно сделать трюк:
^([1-9][0-9]{0,2}|1[0-7][0-9]{2}|180[0-9]|181[0-6])(-([1-9][0-9]{0,2}|1[0-7][0-9]{2}|180[0-9]|181[0-6]))?$
В основном это позволяет
- Число с ведущими от 1 до 0 или более цифрами
- Числос начальным 1, затем 0-7 и дважды любым числом
- число с первым 180, за которым следует еще одно число
- число с первым 181, после которого следует одно число 0-6
- Это необязательно еще раз повторяется после -
Но, как правило, регулярные выражения не годятся для работы с числами (и их сложно обновить, когда число меняется).Если у вас есть такая опция, я бы предпочел просто проверить число с помощью гораздо более простого регулярного выражения, например
^[1-9][0-9]{0,3}(-([1-9][0-9]{0,3}))?$
, и затем программно разделить его на - (если есть) и проанализировать отдельные сегменты как целое и проверить их числовые значениязначение в зависимости от диапазона.
Это позволит дополнительно проверить наличие недопустимых диапазонов, таких как 100-1, 1800-1800 и т. д.