Если вы хотите проанализировать URL, используйте java.net.URI
. У java.net.URL
есть куча проблем - его метод equals
выполняет поиск DNS, что означает, что код, использующий его, может быть уязвим для атак отказа в обслуживании при использовании с ненадежными входами.
«Мистер Гослинг - почему вы сделали URL равным отстой?» объясняет одну такую проблему. Просто привыкните использовать java.net.URI
.
public static String getDomainName(String url) throws URISyntaxException {
URI uri = new URI(url);
String domain = uri.getHost();
return domain.startsWith("www.") ? domain.substring(4) : domain;
}
должен делать то, что вы хотите.
Хотя кажется, что он работает нормально, есть ли лучший подход или есть некоторые крайние случаи, которые могут потерпеть неудачу.
Ваш код не соответствует действительным URL-адресам:
httpfoo/bar
- относительный URL с компонентом пути, который начинается с http
.
HTTP://example.com/
- протокол нечувствителен к регистру.
//example.com/
- протокол относительного URL с хостом
www/foo
- относительный URL с компонентом пути, который начинается с www
wwwexample.com
- доменное имя, которое не начинается с www.
, но начинается с www
.
Иерархические URL имеют сложную грамматику. Если вы попытаетесь свернуть свой собственный анализатор, не читая внимательно RFC 3986, вы, вероятно, ошибетесь. Просто используйте тот, который встроен в основные библиотеки.
Если вам действительно нужно иметь дело с беспорядочными входами, которые java.net.URI
отклоняет, см. RFC 3986 Приложение B:
Приложение B. Анализ ссылки на URI с помощью регулярного выражения
Поскольку алгоритм «первый матч-выигрыш» идентичен «жадному»
метод устранения неоднозначности, используемый регулярными выражениями POSIX, это
естественным и обычным явлением использования регулярного выражения для разбора
возможные пять компонентов ссылки на URI.
Следующая строка - это регулярное выражение для разбиения
правильно сформированная ссылка URI на ее компоненты.
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
12 3 4 5 6 7 8 9
Цифры во второй строке выше предназначены только для удобства чтения;
они указывают контрольные точки для каждого подвыражения (т.е. каждый
парные скобки).