【问题标题】:In Java, how do I extract the domain of a URL?在 Java 中,如何提取 URL 的域?
【发布时间】:2019-01-09 01:52:21
【问题描述】:

我正在使用 Java 8。我想提取 URL 的域部分。万一我错误地使用了“域”这个词,我想要的是我的服务器名称是

test.javabits.com

我想提取“javabits.com”。同样,如果我的服务器名称是

firstpart.secondpart.lastpart.org

我想提取“lastpart.org”。我尝试了以下

final String domain = request.getServerName().replaceAll(".*\\.(?=.*\\.)", "");

但它没有正确提取域。然后我尝试了这个人在他的网站上的内容——https://www.mkyong.com/regular-expressions/domain-name-regular-expression-example/,例如

private static final String DOMAIN_NAME_PATTERN = "^((?!-)[A-Za-z0-9-]{1,63}(?<!-)\\.)+[A-Za-z]{2,6}$";

但这也不是提取我想要的东西。如何正确提取域名部分?

【问题讨论】:

  • google.co.uk 和类似的呢?
  • 刚刚对整个co.uk做了一些研究,似乎还有很多其他的后缀publicsuffix.org/list/public_suffix_list.dat
  • 没有提取我想要的东西。你需要详细说明一些事情,因为当你天真地思考它和所有基于正则表达式的简单解决方案拆分时,它看起来很简单at dot 可能会严重失败。就像@LennartDeters 一样,看看 PSL。您可能需要也可能不需要使用它,具体取决于您要准确提取的内容。没有自动的方法来做同样的事情(列表随着时间的推移而变化,并且不被认为是详尽的,也没有错误,现在有 NXDOMAINs)
  • 同样正则表达式完全错误,它不适用于标签为xn--something 的IDN。一些 TLD 是 IDN。

标签: java regex string parsing subdomain


【解决方案1】:

总结:不要为此使用正则表达式。使用 whois。

如果我尝试从您的问题中推断,找出您真正想做的事情,我猜您想从 URL 的主机部分找到属于某个非基础设施所有者的域。此外,根据您问题的标签,您希望借助正则表达式来完成。

您正在执行的任务充其量是不切实际的,但可能是不可能的。

您必须清除许多极端情况。除了由 Lennart 在https://publicsuffix.org/list/public_suffix_list.dat 中提供的基础设施域列表外,您还可以看到 URL 中的空主机字段或构成主机部分的 IP 地址的情况。

那么,有没有更好的方法呢?当然有。您要做的是在公共数据库中查询您需要的数据。此类查询的协议称为WHOIS

Apache Commons 提供了一种在WhoisClient 中访问 WHOIS 信息的简便方法。从那里您可以查询域字段,并找到一些可能对您有用的更多信息。

应该不会比这个更难

import org.apache.commons.net.whois.WhoisClient;
import java.io.IOException;

public class CommonsTest {
    public static void main(String args) {
        WhoisClient c = new WhoisClient();
        try {
            c.connect(WhoisClient.DEFAULT_HOST);
            System.out.println(c.query(URL));
            c.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用它可以让您获得有关您所要求的域的 whois 信息。如果域是未注册的,即私有域,如www.stackexchange.com 的情况,您将收到一条错误消息,指出没有注册域。删除地址的第一部分,然后重试。找到注册域名后,您还会找到注册商和注册商。

现在,不幸的是,whois 并不像人们想象的那么简单。进一步阅读https://manpages.debian.org/jessie/whois/whois.1.en.html,详细了解如何使用它以及您可以从不同来源获得哪些信息。

另外,查看相关问题here.

【讨论】:

  • @YCF_L 是的,我做到了。
  • 我能知道原因吗?
  • @YCF_L 当然。正如我在我的回答(上图)中所说,这个问题不能用正则表达式解决。相反,通过互联网基础设施可以找到解决此类问题的既定解决方案。因此,我对其他答案投了反对票,因为它们是错误的,而且不起作用。
  • 谢谢!也很好的答案你有我的投票,我想从你那里分享一个真实的代码示例,这对我+1可能更有帮助;)
  • @YCF_L 谢谢!代码示例的要点 - 我会尝试在一天内提供一个。
【解决方案2】:

试试这样:

String parts[] = longDomain.split("."); 
String domain = parts[parts.length-2] + "." + [parts.length -1];

【讨论】:

  • 你应该使用基于parts.length的计算而不是使用'1'和'2'
  • google.co.uk 它将返回 co.uk 。所以它不是域
猜你喜欢
  • 2010-10-24
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 2021-04-12
相关资源
最近更新 更多