大数据Shell编程 之 常用正则表达式
使用man grep查看grep的帮助文档,有如下内容:

可以看出,正则表达式由三类,分别是
- 基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx 简称 BREs)
- 扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)
- Perl 的正则表达式(Perl Regular Expression 又叫 Perl RegEx 简称 PREs)
由于BREs语法中需要大量转义字符,导致正则表达式不易看懂,因此本文使用Perl类型的正则表达式。
1.校验MAC地址
我们常见的MAC地有如下两种格式:
48-5D-60-DE-3D-C5
48:5D:60:61:3D:C5
我们以第一种为例,即一共有6组十六进制的数中间由短横线“-”连接。每组十六进制的数据可以看成是由取值范围为a-f、A-F或0-9的两个字符组成。
首先,用正则表达式表示a-f、A-F或0-9的两个字符
[a-fA-F0-9] [a-fA-F0-9]
可以发现[a-fA-F0-9]重复了两次,因此上述表达式可以写成
[a-fA-F0-9] {2}
然后,用正则表达式表示六组a-f、A-F或0-9的两个字符中间用短横线连接:
[a-fA-F0-9]{2}-[a-fA-F0-9]{2}-[a-fA-F0-9]{2}-[a-fA-F0-9]{2}-[a-fA-F0-9]{2}-[a-fA-F0-9]{2}
上述正则表达式太臃肿了,一组两位的其实我们可以看成
[a-fA-F0-9]{2}-重复了5次(注意后边有个短横线),最后又加了一组[a-fA-F0-9]{2},而其中的0-9可以用\d代替。基于这样的思路,对上述正则表达式进行修改后如下所示:
([a-fA-F\d]{2}-){5}[a-fA-F\d]{2}
最后,我们检验下上述正则表达式是否满足要求。创建一个mac.txt,内容如下所示:
48-5D-60-61-3D-C5
08-D4-hM-1D-AD-AE
28-D2-44-B7-AD-EC
XX-5D-60-61-3D-C5
其中第2和第4行是错误的MAC地址,检测结果如下:

由以上结果可以看出上述正则表达式是正确的。
2.校验邮箱地址
下表是常见的邮箱格式:
@前缀 | 纯数字 | 1234567@qq.com |
---|---|---|
纯字母 | zhang123@qq.com | |
字母数字混合 | zhang123@qq.com | |
带点的 | zhang.san@qq.com | |
带下划线 | zhang_san@qq.com | |
带连接线 | zhang-san@qq.com | |
@后缀 | 二级域名 | 123456@qq.com |
三级域名 | 123456@vip.qq.com |
根据上述常见邮箱格式,我们可以总结出邮箱格式符合的规则
1) 邮箱必有一个@
2) 邮箱@前缀由数字或字母开头
3) 邮箱@前缀由多个字母、数字、段横线-、下划线_、英文句号.自由拼接而成
4) 邮箱@后缀由两级或三级域名组成,其中每个域名中间由英文句号“.”隔开, 而每级域名都是由字母或数字组成
根据以上规则,可以得到如下正则表达式:
1) 邮箱必有一个@ ,对应正则表达式如下所示:
@
2) 邮箱@前缀由数字或字母开头,对应正则表达式如下所示:
^[a-zA-Z0-9]@
其中^表示开始位置,[a-zA-Z0-9]表示数字或字母
3) 邮箱@前缀由多个字母、数字、段横线-、下划线_、英文句号.自由拼接而成
^[a-zA-Z0-9][a-zA-Z0-9-._]+@
其中+表示重复1到多次
4) 邮箱@后缀由两级或三级域名组成,其中每个域名中间由英文句号“.”隔开,而每级域名都是由字母或数字组成。
@([a-zA-Z0-9]+.){1,2}[a-zA-Z0-9]+$
其中([a-zA-Z0-9]+.){1,2}可以拆分成如下内容:
[a-zA-Z0-9] 数字或字母
[a-zA-Z0-9]+数字或字母重复1到多次
[a-zA-Z0-9]+.数字或字母重复1到多次后边加上英文句号.
([a-zA-Z0-9]+.){1,2}数字或字母重复1到多次后边加上英文句号.做为一个整体重复1到2次。
最后的[a-zA-Z0-9]+表示以多个数字或字母结尾。
将上述邮箱@前缀的正则表达式和邮箱@后缀的正则表达式组合在一起,同时由于0-9的数字可以用\d表示,可以用\d替换内容中的0-9,最后得到的表达式我们想要的可以匹配邮箱的正则表达式,如下所示:
^[a-zA-Z\d][a-zA-Z\d-._]+@([a-zA-Z\d]+.){1,2}[a-zA-Z\d]+$
下面我们来检验下写出来的正则表达式:
新建一个mail.txt,内容如下:
ddddd@qq.com
其中最后三行为错误的格式,使用正则表达式进行校验:

由上述结果可以看出,我们的正则表达式是符合要求的。
3.校验手机号
要校验手机号,我们首先需要知道手机号的组成格式。目前国内的手机号有以下格式:
1)由数字1开头
2)第二位数字的取值范围是3、4、5、7、8、
3)最后为9位数字
根据以上规则,写出对应的正则表达式
- 由数字1开头
^1
- 第二位数字的取值范围是3、4、5、7、8、
[34578]
- 最后为9位数字
[0-9]{9}$
其中[0-9]{9}表示0-9的数字取值重复9次,$表示结尾。由于0-9的数字可以由\d表示,上述内容等价于
\d{9}$
将上述正则表达式组合在一起,就可以得到我们想要的正则表达式,如下所示:
^1[34578]\d{9}$
下面开始进行校验,新建一个phone.txt,内容如下:
138537721989
146398702123
12200993333
23848270281
13849199233
d333300-903
其中只有倒数第二行的号码是正确的,使用正则表达式进行校验:

由上述结果可以看出,我们的正则表达式是符合要求的。
4.校验IP地址
对IP地址进行严格校验比较麻烦,首先要确定一个标准可用的IP地址需要满足如下条件:
1) 由四组不大于255的数字组成,中间由“.”连接
2) 取值范围为0.0.0.0-255.255.255.255
一个IP地址可以看成是四组0-255的数组中间由.隔开,进一步可以看成是0-255.重复三次(注意0-255后有点),后边再跟上一个0-255的数字。
下面对0-255的数字可能的组成情况进行分析:
数字 | 取值 | 正则表达式 |
---|---|---|
三位数 | ||
25开头 | 250-255 | 25[0-5] |
20-24开头 | 200-249 | 2[0-4][0-9] |
1开头 | 100-199 | 1[0-9][0-9]等价于1\d{2} |
二位数 | ||
两位数 | 10-99 | [1-9]\d |
一位数 | ||
一位数 | 0-9 | \d |
将上述五种情况组合在一起就是我们想要的结果,这里注意五种情况之间是或的关系,用|连接,可以得到(0-255)的正则表达式如下:
(25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|\d
以上是一组0-255的数据,上边已经分析了思路,IP由三组(0-255).和一组0-255组成,三组(0-255).就是(0-255).重复三次。
首先是(0-255).的表达式:
((25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|\d).
然后重复三次:
(((25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|\d).){3}
最后加上一组(0-255):
(((25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|\d).){3}((25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|\d)
为了更严谨点,需要加上开始和结束限定符,如下所示:
^(((25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|\d).){3}((25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|\d)$
下面开始验证,新建一个ip.txt,内容如下:
290.244.1900.3
254.263.233.0
192.168.266.900
aa.3.0.1
2.2.2.3b
127.02.0.00
192.168.212.11
0.0.0.0
255.255.255.255
其中只有最后三行的IP地址是正确的,我们检验下刚才写的正则表达式:

可以看到输出结果达到了预期的效果,证明正则表达式是有效的。
链接:https://www.jianshu.com/p/e27d46e675a8
大数据Shell编程 之 常用正则表达式的更多相关文章
- 大数据学习之BigData常用算法和数据结构
大数据学习之BigData常用算法和数据结构 1.Bloom Filter 由一个很长的二进制向量和一系列hash函数组成 优点:可以减少IO操作,省空间 缺点:不支持删除,有 ...
- Linux Shell编程之常用技巧
前言 本文集中介绍了bash编程中部分高级编程方法和技巧.通过学习本文内容,可以帮你解决以下问题: 1.bash可以网络编程么? 2..(){ .|.& };. 据说执行这些符号可以死机,那么 ...
- Linux Shell 编程 教程 常用命令
概述: Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户 ...
- shell编程值之正则表达式与字符截取(6)
正则表达式与通配符 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式 通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find.cp ...
- shell编程基础(五): 正则表达式及其使用
正则表达式 1.前情提要 以前我们用grep在一个文件中找出包含某些字符串的行,比如在头文件中找出一个宏定义.其实grep还可以找出符合某个模式(Pattern)的一类字符串.例如找出所有符合xxxx ...
- Shell编程时常用的系统文件(转)
10.1 Linux系统目录结构 / 根目录,所有文件的第一级目录 /home 普通用户家目录 /root 超级用户家目录 /usr 用户命令.应用程序等目录 /var 应用数据.日志等目录 /lib ...
- Shell编程——vim常用命令
[vim]工作模式切换: 在普通模式下输入 i(插入).c(修改).o(另起一行) 命令时进入编辑模式:按 esc 键退回到普通模式. 在普通模式下输入冒号(:)可以进入命令模式.输入完命 ...
- 大数据学习——Linux上常用软件安装
4.1 Linux系统软件安装方式 Linux上的软件安装有以下几种常见方式: 1.二进制发布包 软件已经针对具体平台编译打包发布,只要解压,修改配置即可 2.RPM发布包 软件已经按照redhat的 ...
- Linux学习——shell编程之正则表达式和字符处理命令
shell编程之正则表达式 一 正则表达式 1 什么是正则表达式 正则表达式用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分隔.匹配.查找及替换操作. 2 shell编程之正则表达式 ...
随机推荐
- Python之手把手教你用JS逆向爬取网易云40万+评论并用stylecloud炫酷词云进行情感分析
本文借鉴了@平胸小仙女的知乎回复 https://www.zhihu.com/question/36081767 写在前面: 文章有点长,操作有点复杂,需要代码的直接去文末即可.想要学习的需要有点耐心 ...
- 数据库里的回车字符导致取过来的json字符串不规范的问题
转发:https://bbs.csdn.net/topics/380192638 你可以报保存数据库之前,进行 替换 str = str.Replace("\r\n"," ...
- 在Java web项目中防止用户注销后使用浏览器中的“后退”按钮返回注销前页面
一背景 公司安全整改, 要求:系统中对于关键业务操作应确保使用浏览器"后退"功能无法回到上一步操作界面. 提供:凭证提供所有被检查系统关键业务操作后回退视频,视频显示关键业务操作后 ...
- 项目启动报错 The server time zone value '�й���ʱ��' is unrecognize...
背景介绍: 把项目在新的电脑上运行,MySQL版本不同出现错误 错误: 报错The server time zone value '�й���ʱ��' is unrecognized or repr ...
- 2021最新Java基础知总结,助力大厂offer
本文是我花了三周时间整理出来的,希望对Java初学者有帮助~ Java概述 Java的特点 Java是一门面向对象的编程语言.面向对象和面向过程是一种软件开发思想. 面向过程就是分析出解决问题所需要的 ...
- 如何写好技术文档——来自Google十多年的文档经验
本文大部分内容翻译总结自<Software Engineering at Google> 第10章节 Documentation. 另外,该书电子版近日已经可以免费下载了 https:// ...
- react踩坑笔记
1.create-react-app中配置webpack // 方法一:将项目的配置文件抽取到项目中,即运行: npm run eject // 方法二:使用react-app-rewired 2.c ...
- [解决方案]docker: Error response from daemon: OCI runtime create failed
错误原因 在新服务器上安装好docker后,发现无法运行,经常一顿搜索后,发现是docker安装的版本过高,最新版本docker-18.06 的核心好像没有经过充分的测试就发布了. 导致一运行,就提示 ...
- MySQL 优化特定类型的查询
优化COUNT()查询 COUNT() 是一个特殊的函数,有两种非常不同的作用: 统计某个列值的数量,也可以统计行数.在统计列值时要求列值是非空的(不统计NULL ).如果在COUNT() 的括号中指 ...
- Android音视频开发(1):H264 基本原理
前言 H264 视频压缩算法现在无疑是所有视频压缩技术中使用最广泛,最流行的.随着 x264/openh264 以及 ffmpeg 等开源库的推出,大多数使用者无需再对H264的细节做过多的研究,这大 ...