正则表达式 匹配IP地址
正则表达式匹配IP地址
正则表达式,又称规则表达式。接下来通过本文给大家介绍正则表达式匹配
IP
的表达式,非常不错,具有参考借鉴价值,需要的的朋友参考下吧
这里给大家详细讲解一下一个匹配IP地址的正则表达式,
有关正则方面的知识,会在详细的讲解中提到。
在讲解之前,我先给大家介绍一下,ip地址的生成规则。
IP地址,是由32位数字二进制转为四个十进制的字符串组成。
怎么转化?下面讲解:
二进制:11111111111111111111111111111111
分为四部分:11111111.11111111.11111111.11111111
转化:2^7+2^6+2^5+2^4+2^3+2^2+2^1+2^0=255
转为十进制范围:0~255.0~255.0~255.0~255
这就是IP
地址的范围。
根据这个生成IP
的规则和范围,我们可以用正则表达式来匹配出IP
地址,但怎么匹配呢?各人有各人的方法,这里我讲解一下我的思路。
根据IP地址的字符串规律,我把匹配IP地址的表达式分为两部分来考虑。
第一部分:匹配3个0~255.
(注意后面的一个点)
第二部分:匹配最后的数字0~255
也就是说,先匹配出 0~255.
(注意后面的一个点) 这个字符串,然后重复匹配3次,然后再匹配最后的数字部分0~255。这就是我匹配IP
地址的思路。
首先,我要提一下,正则是没有办法做数字运算的,所以,我们无法用数字运算的方式筛选出IP的数字范围。既然没法用数字运算的方式筛选出IP的数字范围,那么我们应该用什么其他方式来筛选这个数字范围呢?我的思路是分组讨论,然后再把这些分组合并起来组成IP的数字范围。
匹配一个合法的数字
三位数的情况:
- 假设百位是
2
,那么根据IP
数字的范围规则,这里又要分为两种情况,为什么?你想想,最大数字是255
,当十位数为5
时,个位数最大只能为5
是吧?(250-255
).而当十位数为0到4
时,个位数可以是任意数字对吧?(200-249
)
所以,这里的两种情况分别为:2[0-4][0-9]
25[0-5]
- 假设百位数是
1
,那么这个数字的范围为100-199
,对应正则表达式就为1[0-9][0-9]
。这个应该不难理解,就不解释。
两位数的情况
分析完了三位数的情况,接下来就是两数的情况了,假如是两位数,那么十位数的前面第一个数不能为零是吧?也就是范围为10-99
(10,11...,19,20,...,99
),对应的正则表达式为[1-9][0-9]
一位数的情况
剩下的就是个位数的情况了,个位数的情况,大家应该很容易得出结论,就是:[0-9]
。
四种情况分析下来,我们得出了IP数字的范围分组为:
25[0-5]
2[0-4][0-9]
1[0-9][0-9]
[1-9][0-9]
[0-9]
匹配一个合法的数字
所以匹配IPv4中一个和法的数组的正则表达式为(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])
优化:
- 可以把两位数的正则
[1-9][0-9]
和一位数的正则[0-9]
合并,写为[1-9]?[0-9]
. - 用简写
\d
替代[0-9]
所以优化后的一个合法的数字的正则表达式为:(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}
最终的表达式:
三组数字和点号之后,后面还有一组数字。这样的话综合起来就是:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){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}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)
总结
匹配IP地址中的一个数
支持0开头,捕获分组:
1 | (25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d) |
不支持0开头,不捕获分组:
1 | (?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d) |
不支持0开头,匹配整个IP地址
1 | (?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d) |
匹配整个IP地址,并捕获每个数字:
1 | (25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d) |