Help:IPV6的正则表达式表示方法

Help:IPV6的正则表达式表示方法

IPv6 地址大小为 128 位。首选的 IPv6 地址表示为:xxxx : xxxx : xxxx : xxxx : xxxx : xxxx : xxxx : xxxx,其中每个 x 是代表一个 4 位的十六进制数字。IPv6 地址范围从 0000:0000:0000:0000:0000:0000:0000:0000 至 ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff。
    除此首选的格式之外,IPv6 地址还可以其它两种短格式指定:
    1.省略前导零:通过省略前导零指定 IPv6 地址。例如,IPv6 地址 1050:0000:0000:0000:0005:0600:300c:326b 可写为 1050:0:0:0:5:600:300c:326b。
    2.双冒号:通过使用双冒号(::)代替一系列零来指定 IPv6 地址。例如,IPv6 地址 ff06:0:0:0:0:0:0:c3 可写为 ff06::c3。一个 IP 地址中只可使用一次双冒号。

    怎样用正则表达式匹配一个合法的IPV6地址
难点在于IPV6的短格式表示方法:
两个冒号::可以出现在任何位置,用很圡的方法(穷举)可以实现
代码太丑了
模式列表见这里:http://regexlib.com/Search.aspx?k=ipv6
例子之一见这里:
^(^(([0-9A-F]{1,4}(((:[0-9A-F]{1,4}){5}::[0-9A-F]{1,4})|((:[0-9A-F]{1,4}){4}::[0-9A-F]{1,4}(:[0-9A-F]{1,4}){0,1})|((:[0-9A-F]{1,4}){3}::[0-9A-F]{1,4}(:[0-9A-F]{1,4}){0,2})|((:[0-9A-F]{1,4}){2}::[0-9A-F]{1,4}(:[0-9A-F]{1,4}){0,3})|(:[0-9A-F]{1,4}::[0-9A-F]{1,4}(:[0-9A-F]{1,4}){0,4})|(::[0-9A-F]{1,4}(:[0-9A-F]{1,4}){0,5})|(:[0-9A-F]{1,4}){7}))$|^(::[0-9A-F]{1,4}(:[0-9A-F]{1,4}){0,6})$)|^::$)|^((([0-9A-F]{1,4}(((:[0-9A-F]{1,4}){3}::([0-9A-F]{1,4}){1})|((:[0-9A-F]{1,4}){2}::[0-9A-F]{1,4}(:[0-9A-F]{1,4}){0,1})|((:[0-9A-F]{1,4}){1}::[0-9A-F]{1,4}(:[0-9A-F]{1,4}){0,2})|(::[0-9A-F]{1,4}(:[0-9A-F]{1,4}){0,3})|((:[0-9A-F]{1,4}){0,5})))|([:]{2}[0-9A-F]{1,4}(:[0-9A-F]{1,4}){0,4})):|::)((25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{0,2})\.){3}(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{0,2})$$
要用这种 regexp 的话,最好是用已经写好并经过详细测试的 module,拷贝粘贴绝对不是好主意。
@MMMIX

嗯,有道理。我没有使用过IPV6,只是在网上搜到代码就转过来了。应该是测试过才行。


QUOTE:
原帖由 zhasm 于 2008-12-17 13:57 发表
@MMMIX

嗯,有道理。我没有使用过IPV6,只是在网上搜到代码就转过来了。应该是测试过才行。

MMMIX 的意思是说,网上的代码可能经过多次转载、spider 之后,早就不是正确的了,
你粘贴过来之后,又没有办法进行严格的测试,因此容易出现问题。


QUOTE:
原帖由 flw 于 2008-12-17 14:07 发表

MMMIX 的意思是说,网上的代码可能经过多次转载、spider 之后,早就不是正确的了,
你粘贴过来之后,又没有办法进行严格的测试,因此容易出现问题。

就是算把经过严格测试的这种类型的 regexp 拷贝粘贴到你自己的代码里面也绝对不是什么好主意。


QUOTE:
原帖由 MMMIX 于 2008-12-17 14:11 发表

就是算把经过严格测试的这种类型的 regexp 拷贝粘贴到你自己的代码里面也绝对不是什么好主意。

嗯。那样容易让人误解代码的作者经常不理胡子。
还是自己慢慢想想吧,看可不可以把表达式搞得简洁一点