Regex - разрешить символ da sh в основном тексте, но не в начале или конце - PullRequest
0 голосов
/ 08 мая 2020

Как я могу разрешить один следующий символ da sh в части тела, но не в начале или в конце?

https://regex101.com/r/D8MAXP/8/

Один из последующих примеров: https://regex101.com/r/D8MAXP/9/

Regex

^((https?):\/\/)?(www.)?([a-z0-9-])+\.[a-z]+(\/[a-zA-Z0-9#]+\/?)*$

Разрешить:

http://www.b-c.de
https://www.b-c.de
www.b-c.de
b-c.de

Не разрешать:

https://www.foufos-.gr
http://www.foufos-.gr
https://-foufos.gr
http://foufos-.gr
www.-foufos.gr
www.foufos-.gr
www.-foufos.gr
foufos-.gr
-foufos.gr

1 Ответ

1 голос
/ 08 мая 2020

Вместо сопоставления - в классе символов вы можете вынуть его и использовать повторяющуюся группу, добавив дефис перед классом символов

Используйте *, чтобы повторить его 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...