ipv6正则表达式
这是我学习正则表达式时做的笔记,希望对大家有帮助!是作为捕获一般ipv6地址使用的。
分析ipv6格式
一般的xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx以及他的省略格式xxxx::xxxx
以下内容不包括::A.B.C.D 格式以及::FFFF:A.B.C.D格式
- 无省略时
//以下两个不符合规则
1111:2222:3333:4444:5555:6666:7777:
:2222:3333:4444:5555:6666:7777:8888
//以下符合规则
1111:2222:3333:4444:5555:6666:7777:8888
//捕获无压缩的地址
(([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4})
- 存在一个::,则其他的文字相对于冒号分别排列
//以下不符合规则
0000:2222:3333:4444:5555:6666::
0000:2222:3333:4444:5555::7777:
0000:2222:3333:4444::6666:7777:
0000:2222:3333::5555:6666:7777:
0000:2222::4444:5555:6666:7777:
::3333:4444:5555:6666:7777:
:2222:3333:4444:5555:6666::8888
:2222:3333:4444:5555::7777:8888
:2222:3333:4444::6666:7777:8888
:2222:3333::5555:6666:7777:8888
:2222::4444:5555:6666:7777:8888
::3333:4444:5555:6666:7777:8888
//这里左端和右端都只能省略一次0,因此以下是符合规则的
1111:2222:3333:4444:5555:6666::8888
1111:2222:3333:4444:5555::7777:8888
1111:2222:3333:4444::6666:7777:8888
1111:2222:3333::5555:6666:7777:8888
1111:2222::4444:5555:6666:7777:8888
1111::3333:4444:5555:6666:7777:8888
::3333:4444:5555:6666:7777:0000
0000:2222:3333:4444:5555:6666::
//::在左端起始,但右端至少有一组地址
(:(:[\da-fA-F]{1,4}){1,6})
//::在右端起始,但左端至少有一组地址
(([\da-fA-F]{1,4}:){1,6}:)
//::非首尾状态,左右都至少有一定的地址,顺便加上单独的::
(([\da-fA-F]{1,4}:){6}(:[\da-fA-F]{1,4}){1,1})
(([\da-fA-F]{1,4}:){5}(:[\da-fA-F]{1,4}){1,2})
(([\da-fA-F]{1,4}:){4}(:[\da-fA-F]{1,4}){1,3})
(([\da-fA-F]{1,4}:){3}(:[\da-fA-F]{1,4}){1,4})
(([\da-fA-F]{1,4}:){2}(:[\da-fA-F]{1,4}){1,5})
(([\da-fA-F]{1,4}:){1}(:[\da-fA-F]{1,4}){1,6})
(::)
- ipv6最右边的%xx可以视情况捕获,估计也不常用,我这里就不捕获了。
(%\d{1,2})
- 集合1~2有以下的匹配内容
//集合符合条件的类型
(([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4})
(([\da-fA-F]{1,4}:){6}(:[\da-fA-F]{1,4}){1,1})
(([\da-fA-F]{1,4}:){5}(:[\da-fA-F]{1,4}){1,2})
(([\da-fA-F]{1,4}:){4}(:[\da-fA-F]{1,4}){1,3})
(([\da-fA-F]{1,4}:){3}(:[\da-fA-F]{1,4}){1,4})
(([\da-fA-F]{1,4}:){2}(:[\da-fA-F]{1,4}){1,5})
(([\da-fA-F]{1,4}:){1}(:[\da-fA-F]{1,4}){1,6})
(([\da-fA-F]{1,4}:){1,6}:)
(:(:[\da-fA-F]{1,4}){1,6})
(::)
- 地址在一段文本的中间时,要注意头尾
//首部限定组,限定从一个非0-F以及:的字符开始或者从起始点开始匹配
((?<=[^\da-fA-F:])|^)
//末尾限定组,限定最后连接的字符是一个非0-F以及:的字符或者文件结束
((?=[^\da-fA-F:])|$)
- 用|分隔符连接,并包裹,首尾加上限定组。连接起来变成如下的内容
((?<=[^\da-fA-F:])|^)((([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4})|(([\da-fA-F]{1,4}:){6}(:[\da-fA-F]{1,4}){1,1})|(([\da-fA-F]{1,4}:){5}(:[\da-fA-F]{1,4}){1,2})|(([\da-fA-F]{1,4}:){4}(:[\da-fA-F]{1,4}){1,3})|(([\da-fA-F]{1,4}:){3}(:[\da-fA-F]{1,4}){1,4})|(([\da-fA-F]{1,4}:){2}(:[\da-fA-F]{1,4}){1,5})|(([\da-fA-F]{1,4}:){1}(:[\da-fA-F]{1,4}){1,6})|(([\da-fA-F]{1,4}:){1,6}:)|(:(:[\da-fA-F]{1,4}){1,6})|(::))((?=[^\da-fA-F:])|$)
- 有些地方不识别(?<=…)、(?=…)、\d。 \d可以改为0-9
((?<=[^0-9a-fA-F:])|^)((([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4})|(([0-9a-fA-F]{1,4}:){6}(:[0-9a-fA-F]{1,4}){1,1})|(([0-9a-fA-F]{1,4}:){5}(:[0-9a-fA-F]{1,4}){1,2})|(([0-9a-fA-F]{1,4}:){4}(:[0-9a-fA-F]{1,4}){1,3})|(([0-9a-fA-F]{1,4}:){3}(:[0-9a-fA-F]{1,4}){1,4})|(([0-9a-fA-F]{1,4}:){2}(:[0-9a-fA-F]{1,4}){1,5})|(([0-9a-fA-F]{1,4}:){1}(:[0-9a-fA-F]{1,4}){1,6})|(([0-9a-fA-F]{1,4}:){1,6}:)|(:(:[0-9a-fA-F]{1,4}){1,6})|(::))((?=[^0-9a-fA-F:])|$)
- 用Regester亲测有效,测试文本如下;
qw122001:0db8:3c4d:0015:0000:0000:1a2f:1a2basdqwr
2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b
IPv6 地址: 240e:471d:d8a9:2164:5d1d:1dba:5931:d7e3
本地链接 IPv6 地址: fe80::5d1d:1dba:5b41:d6f3%6
IPv6 DNS 服务器: 2400:3200::1
2400:3200:baba::1
IPv4 地址: 192.168.43.222
IPv4 DNS 服务器: 192.168.43.1
fe80:0000:0000:0000:0204:61ff:fe9d:f156 // full form of IPv6
fe80:0:0:0:204:61ff:fe9d:f156 // drop leading zeroes
fe80::204:61ff:fe9d:f156 // collapse multiple zeroes to :: in the IPv6 address
fe80:0000:0000:0000:0204:61ff:254.157.241.86 // IPv4 dotted quad at the end
fe80:0:0:0:0204:61ff:254.157.241.86 // drop leading zeroes, IPv4 dotted quad at the end
fe80::204:61ff:254.157.241.86 // dotted quad at the end, multiple zeroes collapsed
此外,正则表达式匹配这些IPv6形式:
::1 // localhost
fe80:: // link-local prefix
2001:: // global unicast prefix