#regex
#регулярное выражение
Вопрос:
Я знаю , что это происходит медленно из — за ([.-][a-z0-9])*
. Но я не знаю, как это оптимизировать.
^https://([a-z0-9] ([.-][a-z0-9])*) (.([a-z]{2,11}|[0-9]{1,5}))(:[0-9]{1,5})?(/.*)?$
Комментарии:
1.Я думаю, вам не нужна эта конструкция
*)
, опустите группы захвата, если они вам не нужны, и повторите класс символов 1 раз и одну внешнюю группу без захвата 0 раз.^https://[a-z0-9] (?:[.-][a-z0-9] )*.(?:[a-z]{2,11}|[0-9]{1,5})(?::[0-9]{1,5})?(/.*)?$
regex101.com/r/TSxWjX/12. Чего должно достичь это регулярное выражение и почему, по вашему мнению, написание нового регулярного выражения с нуля будет работать лучше, чем выбор одного из многих популярных существующих регулярных выражений для проверки URL? Например, tools.ietf.org/html/rfc2396#appendix-B
3. Еще один отличный ресурс для шаблонов проверки URL-адресов: mathiasbynens.be/demo/url-regex
4. @tripleee Мне нужно принимать только протокол https
5.
(?:[.-][a-z0-9] )*
выглядит неправильно, почему вы хотите принять там точку?
Ответ №1:
Вам не обязательно использовать эту часть )*)
в своем шаблоне. Это также может привести к катастрофическому возврату.
Обратите внимание, что вам нужно экранировать обратную косую черту только в том случае, если разделители для регулярного выражения также /
есть, и вам не нужно экранировать [.-]
Если вам не нужно впоследствии захватывать группы, вы можете их опустить.
^https://[a-z0-9] (?:[.-][a-z0-9] )*.(?:[a-z]{2,11}|[0-9]{1,5})(?::[0-9]{1,5})?(/.*)?$
Шаблон соответствует:
^
Начало строкиhttps://
Совпадениеhttps://
, поскольку вы хотите соответствовать только https[a-z0-9]
Сопоставьте 1 раз с любым из перечисленных(?:[.-][a-z0-9] )*
При необходимости повторите сопоставление.
или-
и 1 раз любого из перечисленных.(?:[a-z]{2,11}|[0-9]{1,5})
Сопоставьте либо 2-11 символов по алфавиту, либо 1-5 цифр(?::[0-9]{1,5})?
Необязательно совпадать:
и 1-5 цифр(/.*)? Optionally match
/` и остальная часть строки$
Конец строки