【问题标题】:Match IPv4 and IPv6 addresses but NOT hostname?匹配 IPv4 和 IPv6 地址但不匹配主机名?
【发布时间】:2012-02-23 08:35:00
【问题描述】:

我想检查一个字符串是 IPv4 还是 IPv6 地址,但没有别的。有什么方法可以使用标准的 java 库来实现这一点?

我知道:

  • InetAddress.getByName(str) - 但它接受主机名
  • IPAddressUtil.isIPv4LiteralAddress(str) - 但它是一个内部类,会给出编译器警告

我知道我可以使用正则表达式,但我更喜欢使用现有的方法。

【问题讨论】:

  • 我认为我们可以同意没有标准(如默认情况下包含)方式来完成此操作。我最终做的是通过一个草率的 IPv4|6 正则表达式运行假定的 IP 地址(以整理出任何不 看起来 像有效 IP 地址的东西),然后调用 InetAddress.getByName(str)在地址上。
  • 你能在java中发布工作解决方案吗?

标签: java ipv6 ipv4


【解决方案1】:

【讨论】:

  • 这门课看起来很不错。
【解决方案2】:

在 C 中执行此操作的方法是使用 inet_pton()。您可以将代码移植到 Java。 (或者使用一些非常复杂的正则表达式,因为匹配 IPv6 地址并不简单。)

如果您有勇气的话,您可以查看this question 中的正则表达式并将其更改为不匹配主机名。 ;-)

【讨论】:

    【解决方案3】:

    The IPAddress Java library 以多态方式同时支持 IPv4 和 IPv6。它有方法来做你描述的事情。

    sample code 可以解决您的问题。

    这里有更多示例代码:

    IPAddressString ipString = new IPAddressString("ipv4 or ipv6 address string goes here");
    System.out.println("IPv4: " + ipString.isIpV4() + " IPv6: " + ipString.isIpV6()); 
    

    【讨论】:

      【解决方案4】:

      简单的经验法则是,如果地址是 x.x.x.x.x.x.x.x,那么它就是 IPV6 地址...尝试查看 Inet4Address 和 Inet6Address 类。

      【讨论】:

      • 当然,但是还有短格式(跳过零)、环回地址等。
      猜你喜欢
      • 2020-07-29
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 2019-07-21
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多