Как вернуть только домен из 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
→ Ссылка
Автор решения: Nowhere Man

Первоначальный код можно было доработать, чтобы получить требуемый результат: вместо 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.

→ Ссылка