多个市场要求无线4G网管全面支持IPv6,在开发过程中,遇到大量需要做IPv6校验的地方,本文通过正则表达式解决IP校验问题,来介绍正则表达式最基本的用法。
2012年6月6日,全球范围内的IPv6网络正式启动,IPv6的应用已经是大势所趋。
正则表达式(Regular expressions)本质上是一个微小的且高度专业化的编程语言,它被签入到高级语言中供程序员使用。正则表达式通过制定一些规则来描述那些你希望匹配的字符集合,比如ip地址、电话号码等。正则表达式的强大之处在于一些特殊符号的使用,特殊符号定义了字符集合、组匹配、模式重复次数。
IPv4地址的长度为32b(bit),分为4段,每段8位,用十进制数表示,每段数字范围为0~255,段与段之间用应为句点“.”隔开。例如某计算机IP地址为111.222.333.2
分析IP地址的组成特点:250-255、200-249、0-199
这三种情况可以分开考虑:
250-255:三位数,百位是2,十位是5,个位是0~5,用正则表达式可以写成:25[0-5]
200-249:三位数,百位是2,十位是04,个位是09,用正则表达式可以写成:2[0-4]\d
0-199:这个可以继续分拆:
l 0-9: 一位数,个位是0~9,用正则表达式可以写成:\d
l 10-99: 二位数,十位是19,个位是09,用正则表达式可以写成:[1-9]\d
l 100-199:三位数,百位是1,十位是09,个位是09,用正则表达式可以写成:1\d{2}
于是0-99的正则表达式可以合写为[1-9]?\d,那么0-199用正则表达式就可以写成(1\d{2})|([1-9]?\d),这样0~255的正则表达式就可以写成(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))
/(?:(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:1[0-9][0-9]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:2[0-4][0-9])|(?:25[0-5])|(?:1[0-9][0-9])|(?:[1-9][0-9])|(?:[0-9]))/
在线校验结果:
https://jex.im/regulex/#!flags=i&re=(%3F%3A(%3F%3A2%5B0-4%5D%5B0-9%5D%5C.)%7C(%3F%3A25%5B0-5%5D%5C.)%7C(%3F%3A1%5B0-9%5D%5B0-9%5D%5C.)%7C(%3F%3A%5B1-9%5D%5B0-9%5D%5C.)%7C(%3F%3A%5B0-9%5D%5C.))%7B3%7D(%3F%3A(%3F%3A2%5B0-4%5D%5B0-9%5D)%7C(%3F%3A25%5B0-5%5D)%7C(%3F%3A1%5B0-9%5D%5B0-9%5D)%7C(%3F%3A%5B1-9%5D%5B0-9%5D)%7C(%3F%3A%5B0-9%5D))
IPv6的地址长度为128b(bit) ,是IPv4地址长度的4倍。采用十六进制表示。IPv6有3种表示方法:
表示方法 | 格式 | 示例 |
---|---|---|
冒分十六进制表示法 | 格式为X:X:X:X:X;X:X:X,其中每个X表示地址中的16b,以十六进制表示 | ABCD:FDEC:2425:AAAA:CBDA:34CC:CCCB:1234 这种表示方法中每个X的前导0都是可以省略的,例如 ABCD:0000:2425:AAAA:0BDA:34CC:B000:1234->ABCD:0:2425:AAAA:BDA:34CC:B000:1234 |
0位压缩表示法 | 在某些情况下,一段IPv6地址中可能包含很长一段0,可以把连续的一段0压缩为“::”。但是,为了保证地址解析的唯一性,地址中“::”只能出现一次 | EEE1:0:0:0:0:0:1001 ->EEE1::1001 0:0:0:0:0:0:E ->0:E 0:0:0:0:0:0:0: -> :: |
内嵌IPv4表示法 | 为了实现IPv4->IPv6的互通,IPv4地址会嵌入到IPv6地址中。此时,地址表示为X:X:X:X:X;X:d.d.d.d,前96b采用冒分16进制表示,后32b地址则使用IPv4地址中的点分法 | ::192.168.0.1与::ee:192.168.0.1 注压缩0法,在前96b中依然适用 |
表示方法 | 格式 | 正则 |
十六进制表示法(包括前导0省略) | 纯数字格式-2000:0003:5522:8999:2333:0000:1232:0001 | ([0-9a-fA-F]{1,4}:){7}([0-9a-fA-F]{1,4}:) |
纯字母格式--AAAA:BBBB:CCCC:DDDD;EEEE:FFFFF:AAAA | ||
数字字母组合格式--AAAA:67BB:22C:1111;2:1311:22AA | ||
格式中前面带0--AAAA:07BB:0000:0111;2:1011:220A | ||
格式中每一位前面每一位带0--0AAA:07BB:0000:0111;02:0011:020A | ||
全为0--0000:0000:0000:0000:0000:0000:0000:0000 | ||
格式中前面带0--AAAA:07BB:0000:0111;2:1011:220A | ||
多位0在中间--0AAA:0:0:0:0:0:020A | ||
多位0在前面--0:0:0:0:f0f:e1:f001:7009 | ||
多位0在后面--f0f:e1:f001:7009:0:0:0:0 | ||
全为0--0:0:0:0:0:0:0:0 | ||
全为0--000:0:0:0:0:0:0:0 | ||
全为0--00:0:0:0:0:0:0:0 | ||
全为0--0000:0:0:0:0:0:0:0 | ||
前导0省略位置便利 | ||
一个位置前导0省略-- | ||
ABCD:EEEE:DDDD:FFFF:11111:2222:3333:1 | ||
ABCD:EEEE:DDDD:FFFF:11111:2222:2:4444 | ||
ABCD:EEEE:DDDD:FFFF:11111:3:3333:4444 | ||
ABCD:EEEE:DDDD:FFFF:4:2222:3333:4444 | ||
ABCD:EEEE:DDDD:5:11111:2222:3333:4444 | ||
ABCD:EEEE:6:FFFF:11111:2222:3333:4444 | ||
ABCD:7:DDDD:FFFF:11111:2222:3333:4444 | ||
8:EEEE:DDDD:FFFF:11111:2222:3333:4444 | ||
其他位置前导0省略-- | ||
AB:EEE:0:FF:1:800:3333:444 | ||
AB:EEE:0:FF:1:800:3330:444 | ||
AB:EEE:0:FF:1:800:3300:444 | ||
AB:EEE:0:FF:4:800:3000:444 | ||
1111:EEE:0:FF:4:800:3000:444b | ||
0位压缩表示法(左起有6个位置用标准16进制表示) | ABCD:EFFF:2ccc:6789:ABCD:EF01:8.6.18.19 | (([0-9A-Fa-f]{1,4}:){6}(((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:[0-9A-Fa-f]{1,4}|:)) |
ABCD:EFFF:2ccc:6789:ABCD:EF01::ABCD | ||
ABCD:EFFF:2ccc:6789:ABCD:EF01:: | ||
0位压缩表示法(左起有5个位置用标准16进制表示) | ABCD:EFFF:2ccc:6789:ABCD::8.6.18.19 | (([0-9A-Fa-f]{1,4}:){5}(:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|((:[0-9A-Fa-f]{1,4}){1,2})|:)) |
ABCD:EFFF:2ccc:6789:ABCD::ABCD | ||
ABCD:EFFF:2ccc:6789:ABCD:: | ||
ABCD:EFFF:2ccc:6789:EF01::ABCD:EF01 | ||
0位压缩表示法(左起有4个位置用标准16进制表示) | ABCD:EFFF:2ccc:6789::ABCD:8.6.18.19 | (([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|((:[0-9A-Fa-f]{1,4}){1,3})|:)) |
ABCD:EFFF:2ccc:6789::8.6.18.19 | ||
ABCD:EFFF:2ccc:6789::ABCD | ||
ABCD:EFFF:2ccc:6789::ABCD:EF01 | ||
ABCD:EFFF:2ccc:6789::ABCD:EF01:EF01 | ||
ABCD:EFFF:2ccc:6789:: | ||
0位压缩表示法(左起有3个位置用标准16进制表示) | ABCD:EFFF:2ccc::8.6.18.19 | (([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|((:[0-9A-Fa-f]{1,4}){1,4})|:)) |
ABCD:EFFF:2ccc::6789:8.6.18.19 | ||
ABCD:EFFF:2ccc::6789:ABCD | ||
ABCD:EFFF:2ccc:6789::ABCD:EF01:8.6.18.19 | ||
ABCD:EFFF:2ccc::ABCD | ||
ABCD:EFFF:2ccc::ABCD:EF01 | ||
ABCD:EFFF:2ccc::ABCD:EF01:EF01 | ||
ABCD:EFFF:2ccc::ABCD:EF01:EF01:EF01 | ||
ABCD:EFFF:2ccc:: | ||
0位压缩表示法(左起有2个位置用标准16进制表示) | ABCD:EFFF::8.6.18.19 | (([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|((:[0-9A-Fa-f]{1,4}){1,5})|:)) |
ABCD:EFFF::6789:8.6.18.19 | ||
ABCD:EFFF::2ccc:6789:8.6.18.19 | ||
ABCD:EFFF::2ccc:2ccc:6789:8.6.18.19 | ||
ABCD:EFFF::ABCD | ||
ABCD:EFFF::ABCD:EF01 | ||
ABCD:EFFF:2ccc::2ccc:2ccc:ABCD | ||
ABCD:EFFF:2ccc::ABCD:EF01:EF01:EF01 | ||
ABCD:EFFF:2ccc::ABCD:EF01:EF01:EF01:EF01 | ||
ABCD:EFFF:: | ||
0位压缩表示法(左起有1个位置用标准16进制表示) | ABCD::8.6.18.19 | (([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|((:[0-9A-Fa-f]{1,4}){1,6})|:)) |
ABCD::6789:8.6.18.19 | ||
ABCD::2ccc:6789:8.6.18.19 | ||
ABCD::2ccc:2ccc:6789:8.6.18.19 | ||
ABCD::EFFF:2ccc:2ccc:6789:8.6.18.19 | ||
ABCD::ABCD | ||
ABCD::ABCD:EF01 | ||
ABCD::2ccc:2ccc:ABCD | ||
ABCD::ABCD:EF01:EF01:EF01 | ||
ABCD::ABCD:EF01:EF01:EF01:EF01 | ||
ABCD::ABCD:EF01:EF01:EF01:EF01:EFF1 | ||
ABCD:: | ||
0位压缩表示法(左起开始压缩) | ::8.6.18.19 | (:(((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|((:[0-9A-Fa-f]{1,4}){1,7})|:)) |
::6789:8.6.18.19 | ||
::2ccc:6789:8.6.18.19 | ||
::2ccc:2ccc:6789:8.6.18.19 | ||
::EFFF:2ccc:2ccc:6789:8.6.18.19 | ||
::EFFF:2ccc:2ccc:6789:6789:8.6.18.19 | ||
::ABCD | ||
::ABCD:EF01 | ||
::2ccc:2ccc:ABCD | ||
::ABCD:EF01:EF01:EF01 | ||
::ABCD:EF01:EF01:EF01:EF01 | ||
::ABCD:EF01:EF01:EF01:EF01:EFF1 | ||
::ABCD:EF01:EF01:EF01:EF01:EFF1:EFF1 | ||
:: |
((([0-9a-fA-F]{1,4}:){7}([0-9a-fA-F]{1,4}|:))|
(([0-9a-fA-F]{1,4}:){6}(((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d))){3})|:[0-9a-fA-F]{1,4}|:))|
(([0-9a-fA-F]{1,4}:){5}(:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|((:[0-9a-fA-F]{1,4}){1,3})|:))|(([0-9a-fA-F]{1,4}:){4}(((:[0-9a-fA-F]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d))){3}))|((:[0-9a-fA-F]{1,4}){1,3})|:))|
(([0-9a-fA-F]{1,4}:){3}(((:[0-9a-fA-F]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d))){3}))|((:[0-9a-fA-F]{1,4}){1,4})|:))|
(([0-9a-fA-F]{1,4}:){2}(((:[0-9a-fA-F]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d))){3}))|((:[0-9a-fA-F]{1,4}){1,5})|:))|
(([0-9a-fA-F]{1,4}:){1}(((:[0-9a-fA-F]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d))){3}))|((:[0-9a-fA-F]{1,4}){1,6})|:))|
(:(((:[0-9a-fA-F]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d))){3}))|((:[0-9a-fA-F]{1,4}){1,7})|:))|
([0-9a-fA-F]{1,4}:){7,7}([0-9a-fA-F]{1,4}|:)| // eg: 1:2:3:4:5:6:7:8 或 1:2:3:4:5:6:7::
([0-9a-fA-F]{1,4}:){1,6}(:[0-9a-fA-F]{1,4}|:)| // eg: 1:2:3:4:5:6::8 或 1:2:3:4:5:6::
([0-9a-fA-F]{1,4}:){1,5}((:[0-9a-fA-F]{1,4}){1,2}|:)| // eg: 1:2:3:4:5::8 或 1:2:3:4:5::
([0-9a-fA-F]{1,4}:){1,4}((:[0-9a-fA-F]{1,4}){1,3}|:)| // eg: 1:2:3:4::8 或 1:2:3:4::
([0-9a-fA-F]{1,4}:){1,3}((:[0-9a-fA-F]{1,4}){1,4}|:)| // eg: 1:2:3::8 或 1:2:3::
([0-9a-fA-F]{1,4}:){1,2}((:[0-9a-fA-F]{1,4}){1,5}|:)| // eg: 1:2::8 或 1:2::
[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6}|:)| // eg: 1::8 或 1::
:((:[0-9a-fA-F]{1,4}){1,7}|:) // eg: ::2:3:4:5:6:7:8 或 ::
/^([0-9a-fA-F]{1,4}:){7,7}([0-9a-fA-F]{1,4}|:)|([0-9a-fA-F]{1,4}:){1,6}(:[0-9a-fA-F]{1,4}|:)|([0-9a-fA-F]{1,4}:){1,5}((:[0-9a-fA-F]{1,4}){1,2}|:)|([0-9a-fA-F]{1,4}:){1,4}((:[0-9a-fA-F]{1,4}){1,3}|:)|([0-9a-fA-F]{1,4}:){1,3}((:[0-9a-fA-F]{1,4}){1,4}|:)|([0-9a-fA-F]{1,4}:){1,2}((:[0-9a-fA-F]{1,4}){1,5}|:)|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6}|:)|:((:[0-9a-fA-F]{1,4}){1,7}|:)/
在线校验结果:
https://jex.im/regulex/#!flags=i&re=(%5B0-9a-fA-F%5D%7B1%2C4%7D%3A)%7B7%2C7%7D(%5B0-9a-fA-F%5D%7B1%2C4%7D%7C%3A)%7C(%5B0-9a-fA-F%5D%7B1%2C4%7D%3A)%7B1%2C6%7D(%3A%5B0-9a-fA-F%5D%7B1%2C4%7D%7C%3A)%7C(%5B0-9a-fA-F%5D%7B1%2C4%7D%3A)%7B1%2C5%7D((%3A%5B0-9a-fA-F%5D%7B1%2C4%7D)%7B1%2C2%7D%7C%3A)%7C(%5B0-9a-fA-F%5D%7B1%2C4%7D%3A)%7B1%2C4%7D((%3A%5B0-9a-fA-F%5D%7B1%2C4%7D)%7B1%2C3%7D%7C%3A)%7C(%5B0-9a-fA-F%5D%7B1%2C4%7D%3A)%7B1%2C3%7D((%3A%5B0-9a-fA-F%5D%7B1%2C4%7D)%7B1%2C4%7D%7C%3A)%7C(%5B0-9a-fA-F%5D%7B1%2C4%7D%3A)%7B1%2C2%7D((%3A%5B0-9a-fA-F%5D%7B1%2C4%7D)%7B1%2C5%7D%7C%3A)%7C%5B0-9a-fA-F%5D%7B1%2C4%7D%3A((%3A%5B0-9a-fA-F%5D%7B1%2C4%7D)%7B1%2C6%7D%7C%3A)%7C%3A((%3A%5B0-9a-fA-F%5D%7B1%2C4%7D)%7B1%2C7%7D%7C%3A)