java 正则 端口号_关于Java:验证InetSocketAddresses的正则表达式(ipv4 / v6 +端口地址)...

我正在寻找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是的,我确实看过链接,但是这些在哪里考虑了端口号(即,您是否完整阅读了问题)? 此外,存在不匹配的值,反之亦然。 这些正则表达式是越野车。.他们不回答我的问题!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值