详解一个自己原创的正则匹配IP的表达式

 

第一种方法(可以匹配有点毛病):检测IP地址的正则表达式

正则表达式:

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

 

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

红色块代表:第一个字符是2,第二个字符是0到4,第三个字符是任意一位数字。表示200~249。

绿色块代表:第一个字符是2,第二个字符是5,第三个字符是0到5。表示250~255。

蓝色块代表:第一个字符是0,或者1,或者可以没有这个字符,第二个字符是任意一位数字,第三个字符是任意一位数字,可以没有这个字符。表示1~199,可以有前导零。

“|”代表“或者”的意思,只要满足三块中的任意一块的意思。

前后的“(”和“)”代表这是一组

 

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

{3}代表重复三次。比如“255.255.255.”。

 

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

最后这一组的意思同上,就是在“.”后面加上相同的检测。

第二种方法:

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地址的表达式分为两部分来考虑。

      第一部分:匹配30~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是吧?而当十位数为04时,个位数可以是任意数字对吧?

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

           A2[0-4][0-9]

           B25[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])

        写到这里,数字的匹配范围正则表达式已经写好了,那么根据我前面的思路: 第一部分:匹配30~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还望读者提出,免得误导其他读者。

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

    下面是我的测试:

复制代码
<?php
$pattern = '/^(?:(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:1[0-9][0-9]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:2[0-5][0-5])|(?:25[0-5])|(?:1[0-9][0-9])|(?:[1-9][0-9])|(?:[0-9]))$/';
//正则匹配ip地址
$ip         = '254.21.0.198';
preg_match($pattern,$ip,$out);
echo '<pre>';
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);
复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

亚洲赛前训练计划

回顾和加深所学算法。 主要回顾用途及使用方法。 图论方面&#xff1a; 1.dfs,bfs 2.强连通&#xff0c;点双连通&#xff0c;边双连通&#xff0c;2-sat 3.匈牙利算法km,以及不等式解 4.网络流&#xff0c;费用流 5.最短路&#xff0c;SPFA&#xff0c;dijstra, floay,斯坦纳树…

天池在线编程 2020年9月26日 日常周赛题解

文章目录1. K步编辑2. 折纸3. 字符串的不同排列4. 硬币排成线题目地址&#xff0c;请点这 1. K步编辑 给出一个只含有小写字母的字符串的集合以及一个目标串(target)&#xff0c;输出所有可以经过不多于 k 次操作得到目标字符串的字符串。 你可以对字符串进行一下的3种操作:…

JavaScript试题练习题

1. 我们可以在下列哪个HTML元素中放置javascript代码&#xff1f; A.< script > B.<javascript > C.< js > D.<scripting > ★标准答案&#xff1a;A 2. 预测以下代码片段的输出结果: var str alert(typeof str); A.. string B..un…

Java的static,final,代码块,内部类,抽象类,接口等

Java的static&#xff0c;final&#xff0c;代码块&#xff0c;内部类&#xff0c;抽象类&#xff0c;接口等 1 static关键字月final关键字 1.1 static static表示静态。可以修饰属性&#xff0c;方法&#xff0c;代码块内部类等&#xff0c;总结如下&#xff1a; 特点修饰属…

使用parted划分GPT分区(转)

parted命令可以划分单个分区大于2T的GPT格式的分区&#xff0c;也可以划分普通的MBR分区&#xff0c;fdisk命令对于大于2T的分区无法划分&#xff0c;所以用fdisk无法看到parted划分的GPT格式的分区。 Parted 命令分为两种模式&#xff1a;命令行模式和交互模式。 1、命令行模式…

04.卷积神经网络 W4.特殊应用:人脸识别和神经风格转换(作业:快乐屋人脸识别+图片风格转换)

文章目录作业1&#xff1a;快乐房子 - 人脸识别0. 朴素人脸验证1. 编码人脸图片1.1 使用卷积网络编码1.2 Triplet 损失2. 加载训练过的模型3. 使用模型3.1 人脸验证3.2 人脸识别作业2&#xff1a;神经风格转换1. 问题背景2. 迁移学习3. 神经风格转换3.1 计算内容损失3.2 计算风…

javascript练习题

1.用typeof bar”object”判断bar是否是一个object的潜在缺陷是什么&#xff1f;怎样才能避免这种缺陷&#xff1f; 答&#xff1a;尽管用typeof bar”object”是一个判断bar是一个object的可靠方法&#xff0c;但是令人惊讶的是&#xff0c;在JavaScript中null也是一个object!…

Maven3路程(三)用Maven创建第一个web项目(1)

一.创建项目 1.Eclipse中用Maven创建项目 上图中Next 2.继续Next 3.选maven-archetype-webapp后&#xff0c;next 4.填写相应的信息&#xff0c;Packaged是默认创建一个包&#xff0c;不写也可以 5.创建好项目后&#xff0c;目录如下&#xff1a; 至此&#xff0c;项目已经创建…

java基础之设计模式

1 设置模式之单例设计模式 概念&#xff1a;保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 &#xff08;1&#xff09;饿汉式&#xff1a; /*** Description 饿汉式* author refuel* version v1.0*/ public class TestSingleton{public static void ma…

数组排序(冒泡、排序)

目前对于数组的排序有主要的两种&#xff0c;一种是选择排序&#xff0c;一种是冒泡排序。当然大学学过数据结构的知道&#xff0c;还有一些其他的排序&#xff0c;这里就不说明了&#xff0c;有时间自己上网查查。其实排序在开发中并不常用&#xff0c; 我们学习它是学一种思想…

LeetCode 1598. 文件夹操作日志搜集器

文章目录1. 题目2. 解题1. 题目 每当用户执行变更文件夹操作时&#xff0c;LeetCode 文件系统都会保存一条日志记录。 下面给出对变更操作的说明&#xff1a; "../" &#xff1a;移动到当前文件夹的父文件夹。如果已经在主文件夹下&#xff0c;则 继续停留在当前文…

Java集合Set,List和Map等

Java集合Set,List和Map等 1 Java集合框架 因为Java是面向对象的语言&#xff0c;对事物的体现都是以对象的形式&#xff0c;为了方便对多个对象的操作&#xff0c;就要对对象进行存储。另一方面&#xff0c;使用Array存储对象方面具有一些弊端 。Java集合就像一个容器&#x…

利用bootstrap框架做了一个采摘节节日活动网页

效果欣赏如下&#xff1a; 总共主要是一下两个块代码&#xff1a; 1.主题&#xff1a; <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"width, initial-scale1.0&qu…

FC网络学习笔记02 -网络配置方法

随着新一代飞机的综合化航电系统对通信需求的不断提高&#xff0c;传统的ARINC429、1553B总线的传输速率分别只有100Kbps和1Mbps&#xff0c;其带宽已远远不 论文联盟 http://Www.LWlm.cOm能满足系统通信的需求&#xff0c;无法为高性能数据处理提供有力的通信支撑。 FC网络是…

LeetCode 1599. 经营摩天轮的最大利润(模拟)

文章目录1. 题目2. 解题1. 题目 你正在经营一座摩天轮&#xff0c;该摩天轮共有 4 个座舱 &#xff0c;每个座舱 最多可以容纳 4 位游客 。你可以 逆时针 轮转座舱&#xff0c;但每次轮转都需要支付一定的运行成本 runningCost 。摩天轮每次轮转都恰好转动 1 / 4 周。 给你一…

1.数据库基本概念知识

数据库 存储数据的仓库 描述一个事物的基本信息 优点: 持久化存储 读写速度极高 保证数据的有效性 RDBMS 当前主要使用两种类型的数据库&#xff1a;关系型数据库、非关系型数据库 所谓的关系型数据库RDBMS&#xff0c;是建立在关系模型基础上的数据库&#xff0c;借助于…

LeetCode 1600. 皇位继承顺序(图的深度优先遍历)

文章目录1. 题目2. 解题1. 题目 一个王国里住着国王、他的孩子们、他的孙子们等等。每一个时间点&#xff0c;这个家庭里有人出生也有人死亡。 这个王国有一个明确规定的皇位继承顺序&#xff0c;第一继承人总是国王自己。我们定义递归函数 Successor(x, curOrder) &#xff…

Java泛型,枚举,注解

Java泛型&#xff0c;枚举&#xff0c;注解 1 泛型 1.1 什么是泛型 泛型&#xff1a;即参数化类型。在不创建新的类型的情况下&#xff0c;通过泛型指定的不同类型来控制形参具体限制的类型。允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值…

2.数据完整性

使用数据类型的原则是&#xff1a;够用就行&#xff0c;尽量使用取值范围小的&#xff0c;而不用大的&#xff0c;这样可以更多的节省存储空间 常用数据类型如下&#xff1a; 整数&#xff1a;int&#xff0c;bit 小数&#xff1a;decimal 字符串&#xff1a;varchar,char 日期…

LeetCode 1601. 最多可达成的换楼请求数目(回溯+剪枝)

文章目录1. 题目2. 解题1. 题目 我们有 n 栋楼&#xff0c;编号从 0 到 n - 1 。每栋楼有若干员工。由于现在是换楼的季节&#xff0c;部分员工想要换一栋楼居住。 给你一个数组 requests &#xff0c;其中 requests[i] [fromi, toi] &#xff0c;表示一个员工请求从编号为 …