Удалите порт и сохраните хост

#regex #vrl

Вопрос:

У меня есть URL-адрес, такой как следующий

 https://www.aaaa.com:5000  -> https://www.aaaa.com
https://bbbb.com:443   -> https://bbbb.com
https://cccc.com     -> https://cccc.com
 

Мне нужно удалить только порт ..

Я пробовал со следующим, что не работает, это занимает все данные

https://regex101.com/r/CIiALR/1

 (https?://.*):(d*)/?(.*)`
 

Хитрость в том, что я должен использовать только регулярное выражение, а не js lib, так как оно мне нужно для использования вектора.

https://vector.dev/docs/reference/vrl/

Также: https://vector.dev/docs/reference/vrl/#parse-custom-logs

Комментарии:

1. Как выглядит ваш вызов регулярного выражения? Вы используете замену?

2. Почему вы пометили это JS, если JS даже не используется? Также: Ваше регулярное выражение работает при условии, что вы правильно его экранируете и удаляете недопустимые обозначения флагов. (Re: // -> > // и g -> > /g ( рабочая демонстрация ))

3. Не могли бы вы пометить язык/среду, которую вы используете? Возможно, вам доступно что-то, что не является библиотекой, чтобы помочь вам.

4. @phuzi Они сделали это; ты уже обновился?

5. @JennyM Вы говорите, что вам нужно удалить только порт, но в вашем третьем примере в конце удаляется недопустимый период. Если это не то, что вы имели в виду, не могли бы вы уточнить, пожалуйста?

Ответ №1:

Нет необходимости в регулярном выражении, вы можете использовать url объект для такого рода работы.

 var url = new URL('https://www.aaaa.com:5000');
url.port = '';
console.log(url.toString()); 

Подробнее об объекте URL — https://developer.mozilla.org/en-US/docs/Web/API/URL

Комментарии:

1. @JennyM Объект url — адреса не является библиотекой.

2. Почему вы должны использовать регулярное выражение. Многие языки будут иметь встроенную поддержку для обработки URL-адресов

3. @phuzi vector.dev/документы/справочник/vrl

Ответ №2:

Глядя на https://vector.dev/docs/reference/vrl/ вы можете использовать именованную группу захвата и при необходимости сопоставить номер порта:

 ^(?P<withoutport>https?://[^/s] ?)(?::d |$)
 
  • ^ Начало строки
  • (?P<withoutport> Именованная группа
    • https?:// Соответствует протоколу
    • [^/s] ? Сопоставление любым символом, кроме / символа пробела или символа без жадности
  • ) Закрыть именованную группу
  • (?::d |$) Совпадение : и 1 цифр или утверждение конца строки

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

Или вы можете сделать это так конкретно, как вам нужно:

  ^(?P<withoutport>https?://[^/s] ?)(?:[:?#/]S*)?$
 

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