我正在寻找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
您能否确切说明您要匹配的内容?我假设您的意思是希望以下任何一项匹配: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。
仅供参考,new InetSocketAddress(InetAddress.getByName("2001:db8::1"), 443)的.toString()返回2001:db8:0:0:0:0:0:1:443。 (丑陋;我必须假定他们会清理掉,因为这不是打印IPv6地址的推荐方法)
这是第三个示例:new InetSocketAddress(InetAddress.getByName("fe80::1%22"), 443) s .toString()返回fe80:0:0:0:0:0:0:1%22:443。
@Mike我再次更新了问题,但可能是这种情况无法解决,因为在这种情况下,我们对Java的行为知之甚少(即太不可预测了)。
我需要将Ipv4 / 6 +端口号地址存储为字符串格式。我实现了一个解决方案,在其中检索byte []并将其转换为基数64。然后附加_和端口号。反向操作很容易。我希望正则表达式解决方案是可能的...
@JVerstry为什么不将字符串打印为URL,这将是更加标准化的格式?
@Mike因为我没有考虑...大声笑。如果您想获得分数,请创建答案...
尝试在InetSocketAddress的.toString()上使用正则表达式可能不是一个好主意。 (请参阅上述问题的评论)
一种可能的替代方法是使用URL或URI以更加标准化的字符串格式打印地址。
编辑:
另一方面,如果您想用正则表达式折磨自己... ;-)
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平台都会以这种方式打印地址。
谢谢。 对于记录,我使用了URI,因为URL不接受tcp模式/协议。
馊主意。 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
您可以看一下正则表达式库
这个lib没有提供我问题的答案...
您是否看过链接? 它列出了一些正则表达式,包括网络地址。
例如,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是的,我确实看过链接,但是这些在哪里考虑了端口号(即,您是否完整阅读了问题)? 此外,存在不匹配的值,反之亦然。 这些正则表达式是越野车。.他们不回答我的问题!