复制的请翻到文章分隔线以后,有文字版本。
——————————————————————————————————————————————————
IPV4正则表达式
Ipv4地址分为ABCDE五大类,其中ABC类是普通ip地址,D类是组播地址,E类保留,作为研究之用。
范围分别为:
A: 1.0.0.1 ―一126.155.255.255
内网地址范围:10.0.0.0 一一10-255.255.255
B: 128.0.0.1 —191.255.255.255
内网地址范围:172.16.0.0——172.31.255.255
C: 192.0.0.1 —223.255.255.255
内网地址范围:192.168.0.0—一192.168.255.255
D: 224.0.0.1 —239.255.255.255
E: 240.0.0.1 —255.255.255.255
细心的人可能发现,127开头的ip并没有包含在其中,这是因为127开头的ip被用作环回地址。
我们的正则要求ip必须是ABC类地址并且不能以127开头。每个字节的第一个数字可以为0,比如说01这种,但是不能连续以0开头,比如说001。
1. ip的第一个字节分作以下几种情况:
1.长度为3且以2开头,范围为200-223
正则:22[0-3]丨2[0-1][0-9]
2.长度为3且以1开头,范围为100-126, 128-199
正则:12[012345689]|1[013456789][0-9]
3.长度为3且以0开头
正则:0[1-9][0-9]
4.长度为2,第1位为0或者不为0
正则:[0-9][1-9]|[1-9][0-9]
5.长度为1
正则:[0-9]
所以第一个字节的表达式为:
(22[0-3]|2[0-1][0-9]|
12[012345689]|1[013456789][0-9]|
0[1 -9][0-9]|
[0-9][1-9]|[1-9][0-9]|
[0-9])
2. 后面三个字节范围为0-255,前面有一个点,第一个数字可以为0但是不能有连续的0。
分为以下几种情况:
1. 以2开头
正则:25[0-5]|2[0-4][0-9]
2. 以1和0开头的情况和第一个字节相同。
所以,单个字节的正则表达式:
(25[0-5]|2[0-4][0-9]|
12[012345689]|1[013456789][0-9]|
0[1 -9][0-9]|
[0-9][1-9]|[1-9][0-9]|
[0-9])
3. 加上点号和重复三次,以及开始和结尾匹配符,IPV4最终正则表达式变为:
((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})
点号之所以用中括号括起来是因为如果不扩起来是匹配任意字符。也可以用两个反斜杆转义。
IPV6正则表达式
ipv6格式的介绍参见这篇文章:
https://blog.csdn.net/qq_31567335/article/details/80035510
格式分为以下几种情况:
1. 前面7个完整的字段,第8个字段为零压缩写法或者数字。如:
1:2:3:4:5:6:7:8
1:2:3:4:5:6:7::
对应的正则表达式为:
(([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}{1}|:))
最外面加一层括号是为了保证与其他正则表达式拼接到一起时保证不产生混乱。
2. 前面6个完整的字段,后面2个字段可能为零压缩写法或者ipv4地址嵌入式写法。如:
1:2:3:4:5:6::8
1:2:3:4:5:6::
1:2:3:4:5:6:192.168.1.1
对应的正则表达式为:
(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}{1}|((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))
3. 前面5个完整的字段,后面3个字段可能为零压缩写法或者ipv4地址嵌入式写法。如:
1:2:3:4:5::
1:2:3:4:5::6
1:2:3:4:5::8
1:2:3:4:5::192.168.1.1
对应的正则表达式为:
(([0-9A-Fa-f]{1,4}:){5}(:[0-9A-Fa-f]{1,4}{1,2}|:((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))
4. 前面4个完整的字段,后面4个字段可能为零压缩写法或者ipv4地址嵌入式写法。如:
1:2:3:4::
1:2:3:4::5
1:2:3:4::8
1:2:3:4::192.168.1.1
对应的正则表达式为:
(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}{1,3}|:((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))
前面3,2,1个完整字段的情况略。
8. 第一个字段即开始简略写法
::8
::192.168.1.1
对应的正则表达式为:
(:(:[0-9A-Fa-f]{1,4}{1,7}|:((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))
所以IPV6的正则表达式为:
(([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}{1}|:))|
(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}{1}|((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))|
(([0-9A-Fa-f]{1,4}:){5}(:[0-9A-Fa-f]{1,4}{1,2}|:((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))|
(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}{1,3}|:((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))|
(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}{1,4}|:((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))|
(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}{1,5}|:((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))|
(([0-9A-Fa-f]{1,4}:){1}(:[0-9A-Fa-f]{1,4}{1,6}|:((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))|
(:(:[0-9A-Fa-f]{1,4}{1,7}|:((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))
上面为了表达逻辑的清晰,用了换行符,删除换行符,便得到IPV6的最终正则表达式:
(([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}{1}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}{1}|((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(:[0-9A-Fa-f]{1,4}{1,2}|:((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}{1,3}|:((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}{1,4}|:((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}{1,5}|:((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){1}(:[0-9A-Fa-f]{1,4}{1,6}|:((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))|(:(:[0-9A-Fa-f]{1,4}{1,7}|:((22[0-3]|2[0-1][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])([.](25[0-5]|2[0-4][0-9]|12[012345689]|1[013456789][0-9]|0[1-9][0-9]|[0-9][1-9]|[1-9][0-9]|[0-9])){3})|:))
HTTPS
正则:
((http|https)://.{1,245})