本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看 活动链接
Q:
我已经使用 Inet6Address.getByName("2001:db8:0:0:0:0:2:1").toString()
方法来压缩 IPv6 地址,并且输出是 2001:db8:0:0:0:0:2:1
,但是我需要 2001:db8::2:1
。,基本上,压缩输出应基于RFC 5952标准,即
- 尽可能缩短:例如,
2001:db8:0:0:0:0:2:1
必须缩短为2001:db8 :: 2:1
,同样,2001:db8 :: 0:1
是这是不可接受的,因为符号::
可以用于产生较短的表示形式2001:db8 :: 1
。 - 处理一个16位0字段:不能只使用符号
::
来缩短一个 16 位 0 字段。例如,表示形式2001:db8:0:1:1:1:1:1
是正确的,但2001:db8 :: 1:1:1:1:1
是不正确的。 - 选择
::
的位置: 当::
的放置有其他选择时,必须缩短连续的 16 位 0 字段的最长运行时间(即,三个连续的零的序列字段在 2001 年缩短:0:0:1:0:0:0:1
)。当连续的 16 位 0 字段的长度相等时(即2001:db8:0:0:1:0:0:1
),必须缩短第一个零位序列。例如,2001:db8 :: 1:0:0:1
是正确的表示形式。
我还检查了 Stackoverflow 中的**另一篇文章**,但是没有指定条件(在 ::
位置的示例选择)。
是否有任何 Java 库可以处理此问题?谁能帮我吗?
提前致谢。
A:
这个方法怎么样?
String resultString = subjectString.replaceAll("((?::0\\b){2,}):?(?!\\S*\\b\\1:0\\b)(\\S*)", "::$2");
复制代码
输入:
2001:db8:0:0:0:0:2:1
2001:db8:0:1:1:1:1:1
2001:0:0:1:0:0:0:1
2001:db8:0:0:1:0:0:1
2001:db8:0:0:1:0:0:0
复制代码
输出:
2001:db8::2:1
2001:db8:0:1:1:1:1:1
2001:0:0:1::1
2001:db8::1:0:0:1
2001:db8:0:0:1::
复制代码
我希望最后一个例子是正确的,如果地址以 0 结尾是否还有其他规则?
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END