我已经使用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/

10-12 03:10