Я написал регулярное выражение проверки URL, но регулярное выражение выполняется очень медленно

#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/1

2. Чего должно достичь это регулярное выражение и почему, по вашему мнению, написание нового регулярного выражения с нуля будет работать лучше, чем выбор одного из многих популярных существующих регулярных выражений для проверки 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 /` и остальная часть строки
  • $ Конец строки

Демонстрация регулярных выражений