получить первый сегмент URL с регулярным выражением javascript

#javascript #regex

#javascript #регулярное выражение

Вопрос:

У меня есть это regexp для извлечения instagram.com имена пользователей

 const matches = value.match(
            /^(?:@|(?:https?://)?(?:www.)?instagr(?:.am|am.com)/)?(w )/?$/
        );
console.log(matches[1])
 

Он отлично работает с www.instagram.com/username но это не работает с www.instagram.com/username?ref=google

Как я могу указать только имя пользователя из URL?

Спасибо за вашу помощь.

Ответ №1:

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

 const url = "www.instagram.com/username?ref=google";
const oUrl = new URL("http://"   url);
console.log(oUrl.pathname.substring(1));
 

или

 let url = "instagram.com/username?ref=google";
if (!url.startsWith("http://") || !url.startsWith("https://")) {
  url = "http://"   url;
}
const oUrl = new URL(url);
console.log(oUrl.pathname.substring(1));
 

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

1. как работать с URL-адресами с www и https:// или без них?

Ответ №2:

Конец $ соответствует концу строки, но конец имени пользователя не обязательно является концом строки. Чтобы разрешить ? после имени пользователя, используйте (?:$|?) вместо $ :

 ^(?:@|(?:https?://)?(?:www.)?instagr(?:.am|am.com)/)?(w )/?(?:$|?)
 

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

Ответ №3:

Вы также можете попробовать способ без регулярных выражений, используя .substring . Вы можете найти его более чистым, чем регулярное выражение.

Он работает с обоими URL-адресами.

 let username = url.substring(
    url.lastIndexOf("/")   1, 
    url.lastIndexOf("?") > 0? url.lastIndexOf("?") : url.length
);
 

Проверьте скрипку:
https://jsfiddle.net/whx5otvp /