【深入浅出Linux】常用正则表达式校验

前言

使用man grep查看grep的帮助文档,有如下内容:

image

可以看出,正则表达式由三类,分别是

  • 基本的正则表达式(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地址,检测结果如下:

image

由以上结果可以看出上述正则表达式是正确的。

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,内容如下:

12345@qq.com

zhangsan@qq.com

zhang.san@qq.com

zhang_san@qq.com

zhang123@qq.com

123zhang@qq.com

zhangsan@vip.qq.com

zhang-san@qq.com

_dfsdfds@qq.com

ddddd@qq.com

zhangsan@vip.qq.com.

其中最后三行为错误的格式,使用正则表达式进行校验:

image

由上述结果可以看出,我们的正则表达式是符合要求的。

3.校验手机号

要校验手机号,我们首先需要知道手机号的组成格式。目前国内的手机号有以下格式:

1)由数字1开头

2)第二位数字的取值范围是3、4、5、7、8、

3)最后为9位数字

根据以上规则,写出对应的正则表达式

  1. 由数字1开头

^1

  1. 第二位数字的取值范围是3、4、5、7、8、

[34578]

  1. 最后为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

其中只有倒数第二行的号码是正确的,使用正则表达式进行校验:

image

由上述结果可以看出,我们的正则表达式是符合要求的。

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地址是正确的,我们检验下刚才写的正则表达式:

image

可以看到输出结果达到了预期的效果,证明正则表达式是有效的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353