проблема
В вашем регулярном выражении подчеркнутая часть в основном (жадная) соответствует как можно большему количеству "меток" с периодами между ними.
^(([a-zA-Z0-9][a-zA-Z0-9-]*([\\.]{1}[a-zA-Z0-9-]+)*)*[a-zA-Z0-9]){0,4}$
----------------------------------------------------
Решение
^(?!-)[a-zA-Z0-9-]{1,63}(?<!-)(?:\.(?!-)[a-zA-Z0-9-]{1,63}(?<!-)){0,4}$
Использование отрицательных взглядов и взглядов для проверки отсутствия '-' в начале и в конце.
Я не совсем уверен, если это то, что вы хотели, но объяснить
это регулярное выражение соответствует:
- по крайней мере, одна этикетка максимум с 5 этикетками
- каждая метка состоит как минимум из одного символа (буквенно-цифровой или '-') и не более 63 символов
- метка не имеет '-' как первый или последний символ
- каждая метка отделяется точкой
Это конкретное регулярное выражение не может быть выполнено путем количественной оценки отдельных групп символов, так как мое требование касается общего размера имени хоста
Если вы хотите ограничить размер совпадения, вы можете добавить что-то вроде
(?=^.{1,20}$)
к началу регулярного выражения. Это гарантирует, что строка содержит не более 20 символов.