#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*)?$