设为首页收藏本站我的广告

运维网

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
总共321条微博

每日一博

查看: 987|回复: 2

[网络技术] 【站长推荐】正则匹配IP的表达式循环源圈的方法【顶】

[复制链接]
  • TA的每日心情
    无聊
    2016-12-16 11:32
  • 签到天数: 1 天

    [LV.1]初来乍到

    aide315 发表于 2017-1-4 19:21:21 | 显示全部楼层 |阅读模式
    【重大新闻】 这里给大家详细讲解一下一个匹配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的数字范围。

           ①、假设IP的数字是百位数,那么根据IP的数字范围,我们可以得出下面几种情况。假设第一个数字为1,那么这个数字的范围就为1[0-9][0-9]。这个应该不难理解,就不解释。

          ②、假设第一个数字为2,那么根据IP数字的范围规则,这里又要分为两种情况,为什么?你想想,最大数字是255,当十位数为5时,个位数最大只能为5是吧?而当十位数为0到4时,个位数可以是任意数字对吧?

          所以,这里的两种情况分别为:

               A、2[0-4][0-9]

               B、25[0-5]

           ③、分析完了百位数的情况,接下来就是十位数的情况了,假如是十位数,那么十位数的前面第一个数不能为零是吧?

    所以十位数的情况可以是:[1-9][0-9]

           ④、剩下的就是个位数的情况了,个位数的情况,大家应该很容易得出结论,就是:[0-9]。

           四种情况分析下来,我们得出了IP数字的范围分组为:

            1[0-9][0-9]

            2[0-4][0-9]

            25[0-5]

            [1-9][0-9]

            [0-9]

           怎么把上面的分组用正则表达式表示出来呢?很简单,用正则的或符号|和分组符号()就可以了,所以上面的分组正则表达式为:

    (1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9])

            写到这里,数字的匹配范围正则表达式已经写好了,那么根据我前面的思路: 第一部分:匹配3个0~255.(注意后面的一个点)

             第二部分:匹配最后的数字0~255

            我们来匹配IP地址的第一部分,正则表达式如下:

             (1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)|([1-9][0-9]\.)|([0-9]\.)

       我在每个数字的后面加了一个点就是匹配出0~255.(注意后面的一个点)

             那么怎么重复匹配三次呢?很简单,我们只要把这五个分组当成整体,再重复匹配三次就行了,正则表达式如下:

          ((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}((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9]))

          写到这里,正则匹配IP的表达式已经出来了,不过,这并不是最终的匹配IP的正则表达式,为什么呢?很简单,正则表达式会对每一个分组都进行捕获匹配,上面把匹配IP分成了那么多分组,而每一个分组的内容都会被正则所捕获,那上面不知道已经捕获多少IP了,呵呵,那么怎么去掉分组的内容呢?很简单,用这个符号?:

          ?:符号放在()圆括号里面,是捕获分组,但不捕获正则表达式的内容的意思。那么,我们把它放到每一个分组里面去,不就去掉了分组的内容了吗?所以,我们还要给每个分组加上?:,加上后正则如下:

    (??: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]))

        即使到这里,还是没有把IP地址匹配出来,我们还要用^和$来限制字符串的开头和结尾,所以,最后的匹配IP地址的正则表达式是:

    ^(??: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]))$

    这就是我匹配IP地址最完整的正则表达式,大家可以借鉴一下,有什么bug还望读者提出,免得误导其他读者。

    上面的正则表达式的()括号都是成对出现的,假如有不成对出现,请读者自己添加一下,可能是我漏写了

    www.wangzhanjianshegs.com  网站建设

    运维网 感谢您的阅读

    点评

    海`外直播网址 t.cn/RxlBLRZ 禁闻视频 t.cn/RxrADkq 某省长说:“请全省人民对我严格监督。” 网友评论:人民拿什么监督你?报纸归你管,电视归你管,网络归你管,我这条信息都归你们管,说删就删,从来也没跟我商   发表于 2017-4-1 20:57
    回复过本主题
    的还回复过:
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    QQ|申请友链|sitemap|手机版|小黑屋|Archiver|运维网 ( 京ICP备16008201号  

    GMT+8, 2018-11-15 21:13 , Processed in 0.070285 second(s), 43 queries , XCache On.

    Powered by Discuz! X3.4 Licensed

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表