我已经使用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 standard,即
1)Shorten as Much as Possible:例如,2001:db8:0:0:0:0:0:2:1必须缩短为
2001:db8::2:1。同样,2001:db8::0:1是 Not Acceptable ,
因为符号“::”本可以用来产生一个
较短的表示形式2001:db8::1。
2) Handling One 16-Bit 0 Field :符号“::”绝不能用于缩短一个16位0字段。
例如,表示形式2001:db8:0:1:1:1:1:1是正确的,但是
2001:db8::1:1:1:1:1不正确。
3)Choice in Placement of "::" : =当放置“::”时有其他选择时,
必须缩短连续的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是正确的
表示。
我还检查了 another post in Stack overflow ,但是没有指定条件(示例放置::的示例)。
是否有任何Java库可以处理此问题?谁能帮我吗?
提前致谢。
最佳答案
这个怎么样?
String resultString = subjectString.replaceAll("((?::0\\b){2,}):?(?!\\S*\\b\\1:0\\b)(\\S*)", "::$2");
不带Java双反斜杠 hell 的说明:
( # Match and capture in backreference 1:
(?: # Match this group:
:0 # :0
\b # word boundary
){2,} # twice or more
) # End of capturing group 1
:? # Match a : if present (not at the end of the address)
(?! # Now assert that we can't match the following here:
\S* # Any non-space character sequence
\b # word boundary
\1 # the previous match
:0 # followed by another :0
\b # word boundary
) # End of lookahead. This ensures that there is not a longer
# sequence of ":0"s in this address.
(\S*) # Capture the rest of the address in backreference 2.
# This is necessary to jump over any sequences of ":0"s
# that are of the same length as the first one.
输入:
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
结尾,是否还有其他规则?)关于java - IPV6地址转换为Java中的压缩形式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7043983/