Как вернуть только домен из URL например --> "http://robotics.industry.ua/news" --> robotics.industry.ua
class GooSearchResultTest {
public static void main(String[] args) {
//test.com
System.out.println(new GooSearchResult("https://test.com").parseDomain());
//apple.in.mars
System.out.println(new
GooSearchResult("http://robotics.industry.ua/news").parseDomain());
}
}
class GooSearchResult {
private String url;
String s;
public String getUrl() {
return url;
}
public GooSearchResult(String url) {
s = (url.replace("http://", "").replace("https://", ""));
}
String parseDomain() {
return s;
}
}
public GooSearchResult(String url) {
s = (url.replace("http://", "").replace("https://", ""));
Это мой вариант с replace
, но в конце не удаляет.
Ответы (2 шт):
import java.net.*;
...
...
try {
URL url = new URL("http://robotics.industry.ua/news");
String host = url.getHost();
System.out.println(host);
} catch (MalformedURLException e) {
throw new MyRuntimeMalformedURLException(e);
}
В host
будет robotics.industry.ua
В целом какие результаты может давать класс URL
:
URL aURL = new URL("http://example.com:80/docs/books/tutorial/index.html?name=networking#DOWNLOADING");
System.out.println("protocol = " + aURL.getProtocol()); //http
System.out.println("authority = " + aURL.getAuthority()); //example.com:80
System.out.println("host = " + aURL.getHost()); //example.com
System.out.println("port = " + aURL.getPort()); //80
System.out.println("path = " + aURL.getPath()); // /docs/books/tutorial/index.html
System.out.println("query = " + aURL.getQuery()); //name=networking
System.out.println("filename = " + aURL.getFile()); ///docs/books/tutorial/index.html?name=networking
System.out.println("ref = " + aURL.getRef()); //DOWNLOADING
Первоначальный код можно было доработать, чтобы получить требуемый результат: вместо String::replace
использовать String::replaceFirst
, так как первый метод принимает строчный литерал, а второй -- регулярное выражение.
Таким образом, в соответствии со спецификацией URL:
<схема>:[//[<логин>[:<пароль>]@]<хост>[:<порт>]][/<URL‐путь>][?<параметры>][#<якорь>]
потребуется удалить следующие части:
public static String getDomain(String url) {
return url
.replaceFirst("^[^:]+:(//)?", "") // убираем схему (всё что до ":") с разделителем "//" включительно
.replaceFirst("^[^@]+@", "") // убираем логин/пароль включительно с "@"
.replaceFirst("(:\\d+)?/.*$", ""); // убираем порт, путь и т.д. (всё, что после "/")
}
Тесты:
String[] tests = {
"test.com",
"https://test.com/mypath",
"http://localhost:8888/api/v1",
"ftp://fakeftp.org/",
"ftps://user1:[email protected]/~user1/file1.txt",
"mailto:[email protected]"
};
for (var url : tests)
System.out.println(parseDomain(url) + "\t в ссылке " + url);
Вывод:
test.com в ссылке test.com
test.com в ссылке https://test.com/mypath
localhost в ссылке http://localhost:8888/api/v1
fakeftp.org в ссылке ftp://fakeftp.org/
fakesto.re в ссылке ftps://user1:[email protected]/~user1/file1.txt
fakemail.to в ссылке mailto:[email protected]
Но в целом вариант с использованием библиотечного класса URL, предложенный Алексеем Шиманским, может быть более предпочтительным, так как он позволяет при необходимости получить другие части URL.