写出ip地址的正则表达式的思路

首先,我们先分析一下ip地址的一些基本情况,如下

1、1到3位
2、有三位时,百位最大为2
3、百位最大为2时,十位最大为5
4、百位最大为2时,十位最大为5时,个位最大为5
5、前三个数后有一点.

先写出满足这样的一个数

一位       [1-9]
二位       [1-9]\d
三位1开头  1\d{2}
三位2开头第二位不是5  2[0-4]\d
三位2开头第二位是5  25[0-5]

用了[]、\d、{}三种符号

很明显,以上都是或的关系

接着,我们将他组合起来,那么满足ip要求的一个数就是
[1-9]|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5])

这里引入了|、()两个符号

前3个还有一点
(([1-9]|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}

这\.是一个转义,代表了字符.

在加上最有一个数就是
(([1-9]|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}([1-9]|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5]))

写出以上正则后,测试了一下
发现对于111.111.111.111匹配出来是111.111.111.1

于是我们将位数多匹配放到前面去,让他先找位数多的匹配,于是变成如下
(((25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|[1-9])\.){3}((25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|[1-9])

再测一下,发现1131.111.111.111也能匹配为131.111.111.111,于是我们我们需要给他规定一下单词边界,查一查正则的文档,用\b可以办到,变成如下

(((\b2[0-4]\d\b)|(\b25[0-5]\b)|(\b1\d{2}\b)|(\b[1-9]\d\b)|\b[1-9])\b\.){3}(\b(2[0-4]\d\b)|(\b25[0-5]\b)|(\b1\d{2}\b)|(\b[1-9]\d\b)|\b[1-9]\b)

这样就没有什么问题了

就这样了,写正则思路最重要,合理的进行情形分解,不断完善

 

以上实际已经能满足我的需求了,更严格一点,111.11.111.111.,在最后带一点的字符串也能匹配出来,我们不想他匹配,因此要对文本边界做限制,查看文档,$可以办到

于是在最后加上$即可

(((\b2[0-4]\d\b)|(\b25[0-5]\b)|(\b1\d{2}\b)|(\b[1-9]\d\b)|\b[1-9])\b\.){3}(\b(2[0-4]\d\b)|(\b25[0-5]\b)|(\b1\d{2}\b)|(\b[1-9]\d\b)|\b[1-9]\b)$

同理。

.11.111.111.11

这样前面有边界符的还能匹配,这个我们该怎么改呢 :-)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值