4

我正在寻找经过测试的 ipv4 和 ipv6 InetSocketAddress正则表达式(即,ip 地址 + 端口号)。我对验证主机名不感兴趣。

它可以是两个正则表达式(一个用于 ipv4,一个用于 ipv6)或一个组合的正则表达式。

有人要分享吗?

编辑

有关 ip4 格式的信息,请参见此处,有关 ipv6 格式的信息,请参见此处。然后,端口号加上':'。

编辑 2 要创建一个字符串表示,我将这样进行:

byte[] tmp = { 10, 1, 0, 0 };
InetSocketAddress isa = new InetSocketAddress(
        InetAddress.getByAddress(tmp), 443);

返回:

/10.1.0.0:443
4

3 回答 3

3

尝试在.toString()of上使用正则表达式InetSocketAddress来做到这一点可能不是一个好主意。(见上述问题的评论)

一种可能的替代方法是使用URLURI以字符串格式打印地址,这更加标准化


**编辑:**

另一方面,如果你想用正则表达式折磨自己...... ;-)

IPv4:

      Pattern: .*/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+):([0-9]+)
Java constant: ".*/([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+):([0-9]+)"

仅处理点分四格式地址。不检测无效地址。

IPv6:

      Pattern: .*/([0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+(%[a-zA-Z0-9]+)?):([0-9]+)
Java constant: ".*/([0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+(%[a-zA-Z0-9]+)?):([0-9]+)"

处理所有 8 个 16 位部分的 IPv6 地址。(再次注意,这样做的唯一原因是因为 Java 中的 Inet6Address 实现似乎以非标准方式打印地址 - 可能因此它可以附加端口号并且没有歧义)不检测无效的 IPv6 地址。仅处理小写十六进制字符。处理带有大写或小写字母和/或数字的区域/范围 ID(如果存在)。

我用我发现的一个方便的小程序对它们进行了测试。

为了记录,我仍然认为这是一个坏主意。;-) 我不能确定是否所有 Java 平台都会以这种方式打印地址。

于 2011-04-21T20:39:40.150 回答
2

你可以看看正则表达式库

于 2011-04-21T17:33:12.910 回答
1

馊主意。RFC 5952形式的IPv6 地址不是正则语言,因此用正则表达式解析它们是通向失败的道路。使用正确的解析函数,例如 POSIXinet_pton函数。Java 应该有一个。谁知道呢,根据 RFC 5952 的第 5 节,它甚至可能足够聪明地处理带有嵌入式 IPv4 子字段的 IPv6 地址。

说真的......不要为此使用正则表达式。

于 2011-04-22T16:19:39.470 回答