Вместо сопоставления -
в классе символов вы можете вынуть его и использовать повторяющуюся группу, добавив дефис перед классом символов
Используйте *
, чтобы повторить его 0+ раз или a ?
, чтобы сопоставить его ноль или 1 раз.
Для примера данных в вопросе вы можете использовать
^((https?):\/\/)?(www\.)?[a-z0-9]+(?:-[a-zA-Z]+)*(?:\.[a-z]+)+(\/[a-zA-Z0-9#]+\/?)*$
Regex demo
Для всех ссылок в примере regex101 вы можете использовать, например, 2 отрицательных просмотра вперед:
^(?!ww?\.)(?:https?:\/\/)?(?:www\.)?(?!.*\.www\b)[a-z0-9]+(?:-[a-zA-Z]+)*(?:\.[a-z]+)+(?:\/[a-zA-Z0-9#]+\/?)*$
По частям
^
Начало строки (?!ww?\.)
Утверждение не начинается с 1 или 2 символов w
, за которыми следует символ. (?:https?:\/\/)?
Необязательно соответствует части протокола (?:www\.)?
Необязательно соответствует www.
(?!.*\.www\b)
Подтвердите, что то, что справа, больше не является www.
[a-z0-9]+(?:-[a-zA-Z]+)*
Сопоставьте символы a-z0-9, необязательно повторенные через a - и снова символы a-z0- 9 (?:\.[a-z]+)+
Повторить 1+ раз точку и 1+ символов az (?:\/[a-zA-Z0-9#]+\/?)*
Повторить 0+ раз, сопоставив /
и 1+ раз любое из th e, за которым следует необязательный вопросительный знак $
Конец строки
Regex demo