IP地址的正则表达式

关键字:IP地址 正则表达式
作者:txw1958
出处:http://www.cnblogs.com/txw1958/archive/2011/10/13/ip_address_regular_expression.html  

IP地址的长度为32位,分为4段,每段8位,用十进制数字表示,每段数字范围为0~255,段与段之间用英文句点“.”隔开。例如:某台计算机IP地址为10.11.44.100。

分析IP地址的组成特点:250-255、200-249、0-199。
这三种情况可以分开考虑,
1. 250-255:特点:三位数,百位是2,十位是5,个位是0~5,用正则表达式可以写成:25[0-5]
2. 200-249:特点:三位数,百位是2,十位是0~4,个位是0~9,用正则表达式可以写成:2[0-4]\d
3. 0-199:这个可以继续分拆,这样写起来更加简单明了.
  3.1. 0-9:    特点:一位数,个位是0~9,用正则表达式可以写成:\d
  3.2. 10-99:  特点:二位数,十位是1~9,个位是0~9,用正则表达式可以写成:[1-9]\d
  3.3. 100-199:特点:三位数,百位是1,十位是0~9,个位是0~9,用正则表达式可以写成: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)))
最后,前面3段加上句点.可以使用{3}重复得到,第4段再来一次同样的匹配,得到IP地址的正则表达式:

 

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

 

与大家互动一下: 

1.  为什么三位数的匹配放在二位数/一位数的前面?因为正则表达式规则之一:最先开始的匹配拥有最高的优先权。
2.  0.0.0.0和255.255.255.255是合法存在的IP地址,你知道是为什么吗?
3.  192.169.01.108这种数字前面多带了个0的类型的,在这里不是合法的,为什么要这样?
4.  为什么前面在最前面要有?:呢?它在这里有什么用?
5.  如果您发现本表达式有错误,也请留言指正!

  

#1楼 2012-07-26 16:20 小子欠扁  
(?: 匹配不获取
  
#2楼 [ 楼主] 2012-09-05 22:33 txw1958  
@小子欠扁 不对哦
http://pic.cnitblog.com/face/340216/20130404192440.png
  
#3楼 2012-09-06 08:56 小子欠扁  
@txw1958
怎么不对,用小括号的时候会匹配到分组里面去,加上?:就不会捕获到分组了
  
#4楼 [ 楼主] 2012-09-13 23:54 txw1958  
@小子欠扁 对了
http://pic.cnitblog.com/face/340216/20130404192440.png
  
#5楼 2012-09-19 17:53 竹墨轩  
貌似222.16.228.22a或222.16.228.2ba可以通过正则验证,不知什么原因?博主可否详细介绍?:用法,有点不清楚哦,谢谢!
http://pic.cnitblog.com/face/u306032.jpg?id=03220912
  
#6楼 [ 楼主] 2012-09-19 20:52 txw1958  
@竹墨轩 只匹配数字部分,字母部分没有包括进来
http://pic.cnitblog.com/face/340216/20130404192440.png
  
#7楼 [ 楼主] 2012-09-21 10:00 txw1958  
@竹墨轩 ?: 不分组
http://pic.cnitblog.com/face/340216/20130404192440.png
  
#8楼 2012-09-30 12:16 duandetao  
0.x.x.x,x非零,是不合法的ip地址
是否要考虑进去,这样就复杂多了
  
#9楼 [ 楼主] 2012-11-07 15:54 txw1958  
@duandetao 这样的话,建议进行二次匹配,
http://pic.cnitblog.com/face/340216/20130404192440.png
  
#10楼 2012-11-15 10:12 sznszbd  
错误:
192.168.0.12201212 校验通过!
  
#11楼 [ 楼主] 2012-11-15 16:50 txw1958  
@sznszbd 正则表达式是用来匹配的
http://pic.cnitblog.com/face/340216/20130404192440.png
  
#12楼 2013-02-01 15:56 一杯子幸福  
@duandetao
((25[0-5])|(2[0-4]\\d)|(1\\d\\d)|([1-9]\\d)|\\[1-9])(\\.((25[0-5])|(2[0-4]\\d)|(1\\d\\d)|([1-9]\\d)|\\d)){3}这个可以
  
#13楼 2690879 2013/5/27 15:33:24 2013-05-27 15:33 iHymenz  
这个正则式不对啊,255.0.0.256的匹配结果是255.0.0.25
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值