IPV4及IPV6正则表达式详解

IPV4及IPV6正则表达式详解

  • 一、 背景
  • 二、实际应用情况
    • 2.1 IPv4
      • 2.1.1 IPv4说明
      • 2.1.2 IPv4地址解析
      • 2.1.3 IPv4正则表达式
    • 2.2 IPv6
      • 2.2.1 IPv6说明
      • 2.2.2 IPv6地址特点
      • 2.2.3 IPv6正则表达式
      • 2.2.4 IPv6正则表达式(不支持ipv6兼容格式)
    • 2.3 正则表达式特殊字符说明

一、 背景

多个市场要求无线4G网管全面支持IPv6,在开发过程中,遇到大量需要做IPv6校验的地方,本文通过正则表达式解决IP校验问题,来介绍正则表达式最基本的用法。

2012年6月6日,全球范围内的IPv6网络正式启动,IPv6的应用已经是大势所趋。

正则表达式(Regular expressions)本质上是一个微小的且高度专业化的编程语言,它被签入到高级语言中供程序员使用。正则表达式通过制定一些规则来描述那些你希望匹配的字符集合,比如ip地址、电话号码等。正则表达式的强大之处在于一些特殊符号的使用,特殊符号定义了字符集合、组匹配、模式重复次数。

二、实际应用情况

2.1 IPv4

2.1.1 IPv4说明

IPv4地址的长度为32b(bit),分为4段,每段8位,用十进制数表示,每段数字范围为0~255,段与段之间用应为句点“.”隔开。例如某计算机IP地址为111.222.333.2

2.1.2 IPv4地址解析

分析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.1.3 IPv4正则表达式

/(?:(?: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))

2.2 IPv6

2.2.1 IPv6说明

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中依然适用

2.2.2 IPv6地址特点

表示方法 格式 正则
十六进制表示法(包括前导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
::

2.2.3 IPv6正则表达式

((([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})|:))|

2.2.4 IPv6正则表达式(不支持ipv6兼容格式)

([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)

2.3 正则表达式特殊字符说明

你可能感兴趣的:(javascript)