Проблема с шаблоном Regexp
Никак не могу решить забачу. Задача такая
- "https://google.ru/http://google.ru" (протокол + конструкция "://" должна быть в начале),
- "http://google.ru///1///2//3" (количество слешей в пути должно быть ограничено одним экземпляром для каждой части пути),
- "http://www.www.google.ru/" (констукция "www" должна встречаться только один раз),
- "https://111.1/" (у IP-адреса определенный формат),
- "https://-999.999.99.999" (у IP-адреса в IPv4 каждая группа может быть целым положительным числом не больше 255),
- "http://-999.999.99.999:-99999" (порт может быть целым положительным числом не больше 65535)
Структура:
- Начинается с http:// или https://;
- затем www. — это необязательная группа;
- IP-адрес — 255.255.255.255 или доменное имя — stasbasov.ru
- порт — тоже необязательная группа. Порт начинается с двоеточия, за которым идут от 2 до 5 цифр. Например: :8080;
- путь — последовательность из цифр, слешей и латинских букв, на конце которого может стоять решётка #.
Использую
^((https|http)(:\/\/))((((([w]{3}\.)?([a-zA-Z]+[^www])?(\.[a-z]{2,3}))|(?:(?:[1-2]|[1-2][1-5][1-5])(\.([1-2][1-5][1-5])){3}))?(([:])(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}))?)?([\/])?)((([a-z0-9#]{1,50}))+?)$
Ответы (1 шт):
Когда вы работаете с регулярными выражениями, важно разбивать выражение на составные части, и работать по частям. Если ваша рабочая версия, это нечитаемый блок, как тот, который вы привели в вопросе, то вам будет очень сложно его менять.
Если у вас есть программа для работы с регулярными выражениями, пользуйтесь ей; если нет, можете использовать программу онлайн.
Начинаем с того, что копируем ваши примеры неправильных адресов, и добавляем несколько правильных. Таким образом, мы сможем видеть, как изменения регулярном выражении будут влиять на результаты.
Начнем с самого первого пункта: префиксы http и https. Оба должны быть в самом начале строки, поэтому вы правильно поставили «^». Дальше «http», а потом, возможно, буква «s», и в конце «://»:
^https?:\/\/
Пункт два предлагаю пока пропустить. Давайте просто напишем выражение для любого имени, состоящего из нескольких частей с буквами/цифрами и либо точкой, либо «/».
^https?:\/\/(\w+[./])*
Дальше порт. В примеры, можно добавить https://example.com:443/, а также https://example.com:123456/ и https://example.com:https/ которые должны определяться как неправильные.
^https?:\/\/(\w+[./])*(\w+:\d{0,5}\/)?$
Путь—та же логика, что и во втором пункте.
^https?:\/\/(\w+[./])*(\w+:\d{0,5}\/)?(\w+\/)*$
Ах да, диез:
^https?:\/\/(\w+[./])*(\w+:\d{0,5}\/)?(\w+\/)*(\w+#)?$
Теперь вернёмся к префиксу «www». Создаём новое регулярное выражение, чтобы протестировать его в изоляции. Наверное мой вариант отнюдь не самый лучший, но другой в голову не приходит:
Используем то, что мы нашли, в главным выражении:
^https?:\/\/((?!www)\w+|www\w)\.(\w+[./])*(\w+:\d{0,5}\/)?(\w+\/)*(\w+#)?$
Частями:
Теперь остаётся проблема с 11111. Ее я вам оставляю вам. Подумайте, какую часть выражения нужно изолировать, и поставить отдельно от нее выражение, которое будет проверять IP адреса?



