千家信息网

正则表达式中如何实现一个匹配IP的表达式

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章给大家分享的是有关正则表达式中如何实现一个匹配IP的表达式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在讲解之前,我先给大家介绍一下,ip地址的生成规则。IP地址
千家信息网最后更新 2025年02月02日正则表达式中如何实现一个匹配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的数字范围。

①、假设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还望读者提出,免得误导其他读者。

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

    下面是我的测试:

';print_r($out);$ip     = '255.777.0.198';preg_match($pattern,$ip,$out);print_r($out);$ip     = '07.25.8.198';preg_match($pattern,$ip,$out);print_r($out);$ip     = '1207.25.8.198';preg_match($pattern,$ip,$out);print_r($out);$ip     = 'qq107.25.8.198';preg_match($pattern,$ip,$out);print_r($out);$ip     = '\.\.\.107.25.8.198';preg_match($pattern,$ip,$out);print_r($out);$ip     = '\.\.\.  7.25.8.198';preg_match($pattern,$ip,$out);print_r($out);$ip     = '107.25.8.19822vvv';preg_match($pattern,$ip,$out);print_r($out);$ip     = '107.25.r8.1982';preg_match($pattern,$ip,$out);print_r($out);$ip     = '107.225.8.19';preg_match($pattern,$ip,$out);print_r($out);$ip     = '225.225.225.225';preg_match($pattern,$ip,$out);print_r($out);$ip     = '0.0.0.0';preg_match($pattern,$ip,$out);print_r($out);$ip     = '00.0.0.0';preg_match($pattern,$ip,$out);print_r($out);$ip     = '0.202.1.0';preg_match($pattern,$ip,$out);print_r($out);$ip     = '0.202.1.226';preg_match($pattern,$ip,$out);print_r($out);$ip     = '249.202.1.0';preg_match($pattern,$ip,$out);print_r($out);$s='';for($i=0;$i<32;$i++){  $s .= '1';}echo $s;echo strlen($s);

感谢各位的阅读!关于"正则表达式中如何实现一个匹配IP的表达式"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

数字 正则 表达式 分组 地址 范围 情况 位数 就是 内容 个位 个位数 字符 字符串 思路 符号 第一部 部分 方式 规则 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 二级数据库设计自然链接 青浦区软件开发专业服务 服务器第三方安全评估机构 数据库中什么情况下用哈希 火山软件开发制作注册窗口 仪器开发和软件开发哪个难 静海区企业网络技术质量保证 软件开发 工作量 单位 一台服务器多少节点 管理软件开发哪儿好 网络安全的未来在云端 如何免费获得cbm数据库账号 服务器文件泄露原理 计算机网络技术基础期末报告 软件产品线进行软件开发 朝阳区森岛网络技术服务工作室 幼儿园网络安全工作台账 数据库中可以有几个主文件组 怎么查询金仓数据库密码 谷歌加载不安全连接服务器 软件开发工作要疯了怎么安慰 网络安全 知名的网站 计算机网络安全第三版马答案 中 国电信网络安全实名制 津如意互联网科技有限公司 国内网络安全靶场 为什么重启服务器之后ninja 哪个程序中创建数据库 提高网络安全的政治站位 香港打水服务器租用
0