【发布时间】: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:443、192.168.0.1、[2001:db8::1]:443和2001: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