Попробуйте это:
^[a-zA-Z]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z]([a-zA-Z0-9-]*[a-zA-Z0-9])?)*$
, как показано в этом демо
Чтобы построить это выражение, мы сначала используем компонент метки (один символ в наборе a-zA-Z
, за которым (необязательно) следует последовательность символов в наборе a-zA-Z0-9-
и заканчивающаяся не -
(дефис разрешено внутри, но не в начале или в конце метки), приводя к
[a-zA-Z]([a-zA-Z0-9-]*[a-zA-Z0-9])?
это выражение повторяется по следующей схеме:
A(\.A)*
, что означает последовательность A
, за которой следует любое количество (даже 0) последовательностей точки, за которой следует еще один экземпляр A
.
Подставляя вышеупомянутые reges в позиции A, мы получаем последнее регулярное выражение. Якоря исключают любые другие окружающие строки в начале / конце строки.
Чтобы проверить, что метки имеют до 63 символов, вы можете сделать
[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?
но будьте осторожны, так как это регулярное выражение компилируется в очень большой табличный автомат (автомат со многими состояниями), так что вам лучше расслабиться, если у вас мало места.