ip地址的正则匹配书写思考

ip 地址的正则匹配写起来也没有想想地那么简单,还是有一些陷阱的

IP 地址分 4 段,每段的范围是 0-255

1. 最简单的版本

简单写,可以写成

1
\d+.\d+.\d+.\d+

但是这个不够精确,因为没有限制数字的个数,如果是 1234.1.23.4567 这样的也是成立的,但是这不是合法的 IP 地址

2. 限制数字的个数

1
\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}

现在数字的个数限制了,但是数字的范围没有限制,比如 300.300.300.300 这样的虽然可以匹配,但不是合法的 IP 地址

3. 限制数字的范围

精确写法:

范围 正则表达式
0-99 [1-9]?\d
100-199 1\d{2}
200-249 2[0-4]\d
250-255 25[0-5]

可以用正则表达式的或操作符: | 和括号把以上这些表达式拼接起来

可以得到下列的伪代码

1
(0-99 | 100-199 | 200-249 | 250-255).(0-99 | 100-199 | 200-249 | 250-255).(0-99 | 100-199 | 200-249 | 250-255).(0-99 | 100-199 | 200-249 | 250-255)

转换成正则表达式就是

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

总结

IP 地址的正则表达式是

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