尝试在.toString()
of上使用正则表达式InetSocketAddress
来做到这一点可能不是一个好主意。(见上述问题的评论)
一种可能的替代方法是使用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 平台都会以这种方式打印地址。