【问题标题】:Regular expression to validate InetSocketAddresses (ipv4/v6 + port addresses)验证 InetSocketAddresses 的正则表达式(ipv4/v6 + 端口地址)
【发布时间】:2011-08-10 11:48:23
【问题描述】:

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

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

有人要分享吗?

编辑

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

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

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

返回:

/10.1.0.0:443

【问题讨论】:

  • 您能否准确说明您要匹配的内容?我假设您的意思是您希望以下任何一个匹配:192.168.0.1:443192.168.0.1[2001:db8::1]:4432001:db8::1 以全部生成匹配项。我问是因为InetSocketAddress 将端口放在单独的构造函数参数中。我想你会想要一个带有组的正则表达式来单独提取它,如果它存在的话。因此,您可能会使用 4 个正则表达式,具体取决于您是单独获得地址还是带有端口的地址。
  • InetSocketAddress.toString() 生成的任何内容。我想通过解析这些字符串来检查并重新创建 ISA。 REM:ISA 总是有一个端口。
  • @JVerstry,谢谢;如果您更新您的问题以提供来自.toString() 的一些您需要匹配的示例输出,这将很有帮助。 (我想最好确保同时包含链路本地和全球单播 IPv6 地址,这样您就可以确保涵盖范围区域的情况)也就是说,我不确定是否最好依赖 .toString() ;是否保证在所有 Java 平台和版本中保持一致?
  • @Mike 我在问题中添加了格式链接。我相信它将在 Java 平台上保持一致。
  • @JVerstry,我认为您的更新不正确。我刚刚尝试了一个测试用例,其中我构建了一个new InetSocketAddress(InetAddress.getByName("10.1"), 443);,而.toString()/10.0.0.1:443。例如,如果您在 .toString() 上运行正则表达式,我认为您不需要担心(例如)非规范化 x.x 格式的 IPv4 地址。这是在 Windows 上的 Java 版本 1.6.0_21-b07 上。

标签: java regex ipv6 ipv4 port-number


【解决方案1】:

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

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

【讨论】:

  • inet_pton() 等同于InetAddress.getByName()。 Java 为您解决所有问题。我发布的正则表达式甚至可以工作的唯一原因是因为 InetAddress 确实 以常规方式打印地址(我想是不正确的)的奇怪方式。例如,new InetSocketAddress(InetAddress.getByName("fe80::192.168.0.1%22"), 443) 返回/fe80:0:0:0:0:0:c0a8:1%22:443
【解决方案2】:

尝试在InetSocketAddress.toString() 上使用正则表达式来执行此操作可能不是一个好主意。 (参见上面问题的 cmets)

一种可能的替代方法是使用URLURI 以字符串格式打印地址,即much more standardized


**编辑:**

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

IPv4:

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

仅处理 dotted-quad 格式的地址。不检测无效地址。

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(如果存在)。

我用handy applet I found 测试了它们。

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

【讨论】:

  • 谢谢。作为记录,我使用了 URI,因为 URL 不接受“tcp”架构/协议。
【解决方案3】:

【讨论】:

  • 你看链接了吗?它列出了一些正则表达式,包括网络地址。
  • 例如,IPv6:^([0-9a-fA-F]{4}|0)(\:([0-9a-fA-F]{4}|0)){7}$。 IPv4 IPv6:([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}|(\d{1,3}\.){3}\d{1,3}。和其他变体。
  • @Santa 是的,我确实查看了链接,但是这些在哪里考虑了端口号(即,您是否完整阅读了这个问题)?此外,有不匹配的值应该,反之亦然。这些正则表达式有问题.. 他们没有回答我的问题!
猜你喜欢
  • 2011-07-14
  • 2021-07-22
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 2012-10-09
相关资源
最近更新 更多