Вот вариант POSIX + look-akead:
^[[:alnum:]](?:[[:alnum:]-](?!-$))*$
Это также позволяет использовать только один символ в качестве совпадения. Это не так читабельно, хотя. ; -)
Обратите внимание, что [[:alnum:]]
- это сокращенный заранее определенный класс символов, эквивалентный [a-zA-Z0-9]
, более эффективный, но в остальном взаимозаменяемый. Не каждый тип регулярных выражений знает эти классы POSIX, используйте традиционную форму, если хотите.
Вот тот, который не допускает множественных последовательных дефисов, и он короче:
^(?:[[:alnum:]]+(?:-(?!$))?)+$
и это не POSIX форма:
^(?:[a-zA-Z0-9]+(?:-(?!$))?)+$