正则表达式匹配ip地址超详细讲解

目录
  • 一、正则匹配基本知识及概念
  • 二、ip地址匹配
  • 附正则表达式匹配IP地址小结
  • 总结

一、正则匹配基本知识及概念

在练习之前,需要大家知道一些基本知识,如果有一定基础的可以跳过该步骤,直接往下看。

正则表达式-字符类

[abc]:代表a或者b,或者c字符中的一个。
[^abc]:代表除a,b,c以外的任何字符。
[a-z]:代表a-z的所有小写字符中的一个。
[A-Z]:代表A-Z的所有大写字符中的一个。
[0-9]:代表0-9之间的某一个数字字符。
[a-zA-Z0-9]:代表a-z或者A-Z或者0-9之间的任意一个字符。
[a-dm-p]:a 到 d 或 m 到 p之间的任意一个字符。

正则表达式-逻辑运算符

&&:并且
| :或者(可以省略)

正则表达式-预定义字符

“.” : 匹配任何字符。
“\d”:任何数字[0-9]的简写;
“\D”:任何非数字[^0-9]的简写;
“\s”: 空白字符:[ \t\n\x0B\f\r] 的简写
“\S”: 非空白字符:[^\s] 的简写
“\w”:单词字符:[a-zA-Z_0-9]的简写
“\W”:非单词字符:[^\w]

正则表达式-数量词

x? : 0次或1次
x* : 0次到多次
x+ : 1次或多次
X{n} : 恰好n次
X{n,} : 至少n次
X{n,m}: n到m次(n和m都是包含的,最少n次,最多m次。

二、ip地址匹配

题目要求:使用正则表达式匹配192.11.23.69

须知:ip地址的范围为0.0.0.0-255.255.255.255

接下来我们直接进入正题吧!在我们看到题目的第一眼,大家可能觉得很简单,这不就用\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

这里我们可以看到使用上述表达式的确匹配成功。

虽然完成了我们的题目要求,有些细心的伙伴会发现,用红色标注出来的部分,重复了三遍,是不是我们可以用分组的方式来简化表达式并完成题目要求。我们把上面的匹配表达式换成分组之后的样子,即(\d{1,3}\.){3}\d{1,3}

表达式讲解:(\d{1,3}\.) 匹配我们前三段的ip地址和’.‘,因为第四段ip地址最后面不能有’.',如果我们使用在同一个分组去匹配就会出现错误情况,而\d{1,3}刚好匹配我们最后一段ip地址

匹配效果如下:

匹配同样成功,该模式有什么不对的地方吗?从语法上看,完全正确,也达到了我们的题目要求,可是我们有没有注意到,我们日常生活中所用的ip地址每一位都是在0-255之间,但是我们上面写的表达式会匹配0-999之间的所有ip地址,如果在未来的工作中,有这样的需求,要匹配所有合法的ip地址,那么我们上面所写的正则表达式是不是就不符合要求了,这里就需要我们使用子表达式的嵌套(注意:有一点很重要。通过上面的例子,我们发现,写一个能够匹配预期内容的正则表达式其实并不难,但是写一个能够考虑到所有可能场景,确保将不需要匹配的内容排除在外的正则表达式就困难多了)

所以我将上面的表达式又改进了一下(这里用到了子表达式的嵌套,如果不懂的小伙伴可以先看一下基本概念再来看接下来的内容)。我们发现当ip地址仅有一位或者两位的时候(即1.1.1.1 or 11.11.11.11),用(\d{1,2}\.)就可以完成匹配,当ip地址为三位的时候,会有这么两种情况(这里留下个疑问,考虑到初学者可能犯错的情况)?

1:ip地址开头为1的时候,我们后面的两位每一位的范围都在0-9之间,而\d这个元字符刚好满足了我们的要求,所以使用(1\d{2}.)就满足了我们在100-199ip地址的匹配,这个其实还相对简单,接下来就是200-255之间ip地址的匹配了,有些同学可能会想,我们可以使用匹配100-199的表达式来实现对200-255ip地址的匹配,即(2\d{2}\.)这样的表达式来实现,可是这样会把256-299之间的ip地址匹配到,违反了我们的意愿,所以我改良了一下表达式(2[0-5]{2}\.]),这样就只会匹配到200-255之间的ip地址,既然子表达式都写好了,就让我们来实践看看效果吧!

表达式为:((1\d{2}.)|(2[0-5]{2}.)|(\d{1,2}.)){3}((\d{1,2})|(1\d{2})|(2[0-5]{2}))),伙伴们可以一起实践一下!

匹配成功,可是再写出这个表达式,我们要测试某些特殊情况是否不在我们的匹配范围内,于是我发现了以下两个比较重要的问题。

第一种:

合法ip地址匹配错误

第二种:

非法ip地址匹配成功

为什么会出现上面的情况?

当我们觉得表达式很完美的时候,虽然256超出匹配范围,但是因为(\d{1,2}\.)的影响,使得我们的非法表达式也匹配成功,本来192.11.23.200为合法表达式,却只匹配到了98.11.23.200,请大家看我用红色箭头标注的地方,会不会跟我们子表达式的顺序有关呢?那好,我来改变一下顺序,我们将(\d{1,2}\.)放到了最后,防止出现错误匹配

改变匹配顺序后的表达式为:
( ( (2[0-5]{2}.)|(1\d{2}.)|(\d{1,2}.)){3}((1\d{2})|(2[0-5]{2})|(\d{1,2})))

果然,第一种情况我们是因为子表达式顺序的原因,导致匹配错误。

可是第二种情况使用改变顺序的表达式,依然会出现以上问题(这里也就印证了上文提到的那些话,要想写出一个符合规范的表达式就很困难)。

于是这里的^就起到了作用,我们可以把第一个子表达式单另拉出来加上^表示第一段ip地址开头为(\d{1,2}),这样刚好避免了我们如上的情况,效果如下:

可以看到非法ip不在我们的匹配当中。

其实写到这里大家是不是感觉已经大功告成了?回答:No

(2[0-5]{2})这个表达式能否匹配239这个ip呢?不知道有没有细心的小伙伴发现

所以最终正确的表达式应该为:
(^((2[0-4]\d.)|(25[0-5].)|(1\d{2}.)|(\d{1,2}.))((2[0-5]{2}.)|(1\d{2}.)|(\d{1,2}.){2})((1\d{2})|(2[0-5]{2})|(\d{1,2})))

在这里可以跟大家说一下,是否可以使用$来避免我们上述第一种问题,有兴趣的可以尝试一下

附正则表达式匹配IP地址小结

1. IP段都表示一个字节,即只能在 0~255之间。

所以一个正确的IP应该是:(0~255) .(0~255) .(0~255) .(0~255)

通过观察可以发现可以将整个IP分为两部分匹配,即:(0~255) 和 .(0~255) 3次

2. 0~255可以分两部分匹配 0~199 和 200~255

a) 0~199 正则表达式为 [0-1]?\d{1,2}

[0-1]? 表示匹配 0或1一次或零次

\d 表示匹配任意一个十进制数字,即 0~9

{1,2} 表示匹配上一个元素至少一次,最多两次,这里就是 \d一次或两次

b) 200~255 正则表达式为 2((5[0-5])|([0-4]\d)),又可以分为两部分 200~249 和 250~255

2 表示必须以2开头

5[0-5] 表示匹配 50~55 之间的数

[0-4]\d 表示 00~49 之间的数

3.三个部分的正则匹配

a) (0~255) 的正则表达式可以写为 (2((5[0-5])|([0-4]\d)))|([0-1]?\d{1,2})

b) .(0~255) 的正则表达式可以写为 .((2((5[0-5])|([0-4]\d)))|([0-1]?\d{1,2}))

c) .(0~255) 匹配3次的正则表达式可以写为 (.((2((5[0-5])|([0-4]\d)))|([0-1]?\d{1,2}))){3}

总结

到此这篇关于正则表达式匹配ip地址的文章就介绍到这了,更多相关正则表达式匹配ip地址内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • javascript正则表达式模糊匹配IP地址功能示例

    本文实例讲述了javascript正则表达式模糊匹配IP地址功能.分享给大家供大家参考,具体如下: function checkip() { var strIP = document.getElementById("accessip").value; var re = /^(\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)$/g //模糊匹配IP地址的正则表达式 if(re.test(strIP)){ if(RegExp.$1

  • 正则表达式匹配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

  • IP地址正则表达式匹配方法

    正则表达式(Regular Expression,在代码中常简写为regex.regexp或RE)是计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.在很多文本编辑器里,正则表达式通常被用来检索.替换那些符合某个模式的文本.许多程序设计语言都支持利用正则表达式进行字符串操作.在很多文本编辑器里,正则表达式通常被用来检索.替换那些符合某个模式的文本. 正则表达式 ^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[

  • Javascript中正则表达式的全局匹配模式分析

    复制代码 代码如下: var str = "123#abc"; var re = /abc/ig; console.log(re.test(str)); //输出ture console.log(re.test(str)); //输出false console.log(re.test(str)); //输出ture console.log(re.test(str)); //输出false 在创建正则表达式对象时如果使用了"g"标识符或者设置它了的global属性值

  • 匹配 IP 地址与域名的正则表达式

    一个完整的域名,由根域.顶级域.二级.三级--域名构成,每级域名之间用点分开,每级域名由字母.数字和减号构成(第一个字母不能是减号),不区分大小写,长度不超过63. 单独的名字可以由正则表达式[a-zA-Z0-9][-a-zA-Z0-9]{0,62}来匹配,而完整的域名至少包括两个名字(比如google.com,由google和com构成),最后可以有一个表示根域的点(在规范中,最后有一个点的才是完整域名,但一般认为包括两个以上名字的域名也是完整域名,哪怕它后面没有点). 匹配完整域名的正则表达

  • javascipt匹配单行和多行注释的正则表达式

    在使用node.js时.如果我们使用.json文件存储一些配置时,希望加上一些注释. 但是由于读取时,是读取字符串 ,然后用JSON.parse 来 转换成json对象,由于有注释的存在则无法正确转换甚至报错. 一下正则表达式 匹配字符串中的所以注释,包括单行和多行注释 复制代码 代码如下: (/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*) 测试地址: http://gskinner.com/RegExr/?30jrh 注意 当使它用作 字符串

  • Javascript中使用exec进行正则表达式全局匹配时的注意事项

    本文就是介绍在使用 Javascript 中使用 exec 进行正则表达式全局匹配时的注意事项. 先看一下常见的用法: 复制代码 代码如下: <script type="text/javascript"> var pattern = /http:\/\/([^\/\s]+)/; alert(pattern.exec('http://www.codebit.cn')); // http://www.codebit.cn,www.codebit.cn alert(pattern

  • JavaScript正则表达式的分组匹配详解

    分组 下面的正则表达式可以匹配kidkidkid: /kidkidkid/ 而另一种更优雅的写法是: /(kid){3}/ 这里由圆括号包裹的一个小整体称为分组. 候选 一个分组中,可以有多个候选表达式,用|分隔: var reg = /I love (him|her|it)/; reg.test('I love him') // true reg.test('I love her') // true reg.test('I love it') // true reg.test('I love

  • javascript中匹配价格的正则表达式

    复制代码 代码如下: /^(d*.d{0,2}|d+).*$/ hansir给出的测试代码如下: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xht

  • 正则表达式匹配ip地址超详细讲解

    目录 一.正则匹配基本知识及概念 二.ip地址匹配 附正则表达式匹配IP地址小结 总结 一.正则匹配基本知识及概念 在练习之前,需要大家知道一些基本知识,如果有一定基础的可以跳过该步骤,直接往下看. 正则表达式-字符类 [abc]:代表a或者b,或者c字符中的一个.[^abc]:代表除a,b,c以外的任何字符.[a-z]:代表a-z的所有小写字符中的一个.[A-Z]:代表A-Z的所有大写字符中的一个.[0-9]:代表0-9之间的某一个数字字符.[a-zA-Z0-9]:代表a-z或者A-Z或者0-

  • Python正则表达式匹配ip地址实例

    本文实例讲述了正则表达式匹配ip地址实例.代码结构非常简单易懂.分享给大家供大家参考. 主要实现代码如下: import re reip = re.compile(r'(?<![\.\d])(?:\d{1,3}\.){3}\d{1,3}(?![\.\d])') for ip in reip.findall(line): print "ip>>>", ip PS:关于正则,这里再为大家推荐2款非常方便的正则表达式工具供大家参考使用: JavaScript正则表达式

  • Shell脚本中通过正则表达式匹配IP地址

    在运维场景下,我们经常需要在服务器上用正则表达式来匹配IP地址. shell和其它编程语言一样,也可以使用正则分组捕获,不过不能使用 $1或\1这样的形式来捕获分组,可以通过数组${BASH_REMATCH}来获得,如${BASH_REMATCH[1]},${BASH_REMATCH[N]} 下面以ip="121.0.2.2"为例,shell脚本代码如下(当然,你要做成更通用交互式的脚本,可以通过expect来实现): 复制代码 代码如下: #!/bin/bash ip="1

  • 超详细讲解python正则表达式

    目录 正则表达式 1.1 正则表达式字符串 1.1.1 元字符 1.1.2 字符转义 1.1.3 开始与结束字符 1.2 字符类 1.2.1 定义字符类 1.2.2 字符串取反 1.2.3 区间 1.2.4 预定义字符类 1.3 量词 1.3.1 量词的使用 1.3.2 贪婪量词和懒惰量词 1.4 分组 1.4.1 分组的使用 1.4.2 分组命名 1.4.3 反向引用分组 1.4.4 非捕获分组 1.5 re模块 1.5.1 search()和match()函数 1.5.2 findall()

  • python正则表达式re.sub各个参数的超详细讲解

    目录 一.re.sub(pattern, repl, string, count=0, flags=0) 二.参数讲解 1.pattern参数 2.repl参数 2.1.repl是字符串 2.2.repl是函数 3.string参数 4.count参数 5.flags参数 5.1.IGNORECASE(简写I) 5.2.LOCALE(简写L) 5.3.MULTILINE(简写M) 5.4.DOTALL(简写S) 5.5.VERBOSE(简写X) 补充:repl为函数时的用法 总结 一.re.su

  • python正则表达式匹配IP代码实例

    这篇文章主要介绍了python正则表达式匹配IP代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 import re re.search(r'([1]\d\d|2[0-4]\d|25[0-5])','192') #re.search(r'([01]\d\d)','1XX') #[01] \d \d # 1 0-9 0-9 #re.search(r'(2[0-4]\d)','2XX') #2 [0-4] \d #2 0-4 0-9 #re.

  • 超详细讲解Linux DHCP服务

    目录 一.DHCP服务(动态主机配置协议) 1.背景 2.概述 3.优点 4.DHCP报文类型 5.DHCP 的分配方式 二.安装 DHCP 服务器 1.DHCP 服务软件 2.主配置文件 三.配置步骤 1.使用 DHCP 动态的给 PC 机分配 IP 地址 ① eNSP ②虚拟机 ③验证 ④进入命令行"ipconfig"测试 一.DHCP服务(动态主机配置协议) 1.背景 1.手动设置工作量大且容易冲突 2.用DHCP可以减少工作量和避免地址冲突 2.概述 作用:为局域网内的电脑分配

  • Java超详细讲解SpringMVC如何获取请求数据

    目录 1.获得请求参数 1)基本类型参数:​​​​​​​   2)POJO类型参数: 3)数组类型参数   4)集合类型参数   2.请求乱码问题 3.参数绑注解@RequestParam​​​​​​​ 4.获得Restful风格的参数 5.自定义类型转换器 6.获得请求头 7.文件上传 8.小结 1.获得请求参数 客户端请求参数的格式是:name=value&name=value- - 服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数: 1)基本类型

随机推荐