匹配ipv4地址的正则表达式

本文主要介绍使用正则表达式匹配ipv4地址。

1、粗犷匹配

比较粗犷的匹配方法,直接匹配四组使用了.进行分隔的数字

1
\d+\.{3}\d+

但是这样容易把不是ip的也匹配进去,比如说8888.888.88.8这样的也是符合规则的,所以想要尽可能的准确,我们就要进行精细的匹配。

2、精准匹配所有ip

首先我们要确定ipv4地址的范围是0.0.0.0255.255.255.255。然后就使用正则表达式逐个字进行匹配。

首先要匹配0-255这256个数字,由于正则表达式在这里不能直接使用数值大小进行匹配,并且需要尽可能地精确控制数值范围,所以我们将其分为0-910-99100-199200-249250-255一共五个部分:

1
2
3
4
5
6
?:					   # 非获取匹配,只匹配但是不获取
(?:1[0-9][0-9]\.) # 100-199
(?:2[0-4][0-9]\.) # 200-249
(?:25[0-5]\.) # 250-255
(?:[1-9][0-9]\.) # 10-99
(?:[0-9]\.) # 0-9

注意这五个分组都是或|关系,前面三个部分都是0-255加上一个点.,最后的是没有点的.,所以前面的执行三次匹配,最后再加上没有点.的一次,正好就能匹配所有的IP地址

1
(?:(?:1[0-9][0-9]\.)|(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5])|(?:[1-9][0-9])|(?:[0-9]))

3、匹配局域网IP地址

局域网ip地址分为三个大的网段,分别是10.x.x.x172.16.0.0—172.31.255.254192.168.x.x,具体匹配思路和上面一样

10.x.x.x

1
10(?:(?:\.1[0-9][0-9])|(?:\.2[0-4][0-9])|(?:\.25[0-5])|(?:\.[1-9][0-9])|(?:\.[0-9])){3}

172.16.0.0—172.31.255.254

1
172(?:\.(?:1[6-9])|(?:2[0-9])|(?:3[0-1]))(?:(?:\.1[0-9][0-9])|(?:\.2[0-4][0-9])|(?:\.25[0-5])|(?:\.[1-9][0-9])|(?:\.[0-9])){2}

192.168.x.x

1
192\.168(?:(?:\.1[0-9][0-9])|(?:\.2[0-4][0-9])|(?:\.25[0-5])|(?:\.[1-9][0-9])|(?:\.[0-9])){2}

匹配所有局域网IP地址

1
(?:(?:10(?:(?:\.1[0-9][0-9])|(?:\.2[0-4][0-9])|(?:\.25[0-5])|(?:\.[1-9][0-9])|(?:\.[0-9])))|(?:172(?:\.(?:1[6-9])|(?:2[0-9])|(?:3[0-1])))|(?:192\.168))(?:(?:\.1[0-9][0-9])|(?:\.2[0-4][0-9])|(?:\.25[0-5])|(?:\.[1-9][0-9])|(?:\.[0-9])){2}