点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!
“父兮生我,母兮鞠我……欲报之德,昊天罔极”。母亲节,给母亲献一束什么花?
今日将昨日之所学整理分享给大家。
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
正则表达式的特点是:
灵活性、逻辑性和功能性非常强;
可以迅速地用极简单的方式达到字符串的复杂控制。
对于刚接触的人来说,比较晦涩难懂。
1. syslog事件标准化
syslog内容如下:
2011 Mar 24 11:51:48 CHN: %ETHPORT-5-IF_DOWN_LINK_FAILURE: Interface Ethernet13/29 is down (Link failure)
2. 自动巡检正则匹配
统计CPU空闲率:sar 3 10命令中的system列和iowait列的average值。
如下图:

通过工具测试正则表达式的功能,并将表达式用于到JavaScript编写相应的巡检脚本。
在编写或测试正则表达式时常用RegexBuddy。

1. 普通字符
字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是"普通字符"。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。
举例1:
表达式 "27",在匹配字符串 " 9527test:failed" 时,匹配结果如下图:

举例2:
表达式 "f",在匹配字符串 " 9527test:failed " 时,匹配结果如下图:

2. 元字符
常见的元字符如下表:


举例1:
表达式 "[^A-Z]",在匹配字符串 "FAS3207" 时,只能匹配其中任意一个字符(3或者2或者0或者7),匹配结果如下图:

举例2:
表达式 "\d+\.?\d*" 匹配字符串:
CPUUtil:99.23
MemoryUsage:33.44
version:2.0
匹配结果如下图:

3. 贪婪与非贪婪模式
1)贪婪模式
在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:"{m,n}", "{m,}", "?", "*", "+",具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。
比如,针对文本 "failed",举例如下:

由此可见,"\w+" 在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个 "d",但那也是为了让整个表达式能够匹配成功。
同理,带 "*" 和 "{m,n}" 的表达式都是尽可能地多匹配,带 "?" 的表达式在可匹配可不匹配的时候,也是尽可能的 "要匹配"。这 种匹配原则就叫作 "贪婪" 模式 。
2)非贪婪模式
在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式,也叫作 "勉强" 模式。
如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。
举例如下,针对文本 "failed" 举例:

效果图如下:


举例1-非贪婪模式:
表达式<KPI(\s\S+){3}>(\r\n.*)+?(\r\n)</KPI> 匹配字符串。
<KPI ID="10103006020" NAME="F5新建连接数" RESCLASS="ResSwitch"><OID ID="3002" VENDER="F5"/></KPI><KPI ID="10103006021" NAME="F5客户端入流量" RESCLASS="ResSwitch"><OID ID="3003" VENDER="F5"/></KPI><KPI ID="10103006022" NAME="F5客户端出流量" RESCLASS="ResSwitch"><OID ID="3004" VENDER="F5"/></KPI>
如下图:

举例2-贪婪模式:
表达式<KPI(\s\S+){3}>(\r\n.*)+(\r\n)</KPI>,匹配举例1的字符串,如下图:

总结:边界匹配的地方,如xml文件中的<xxx>…</xxx>,尽量使用简捷的非贪婪匹配.*?特别是对于复杂的表达式来说,采用非贪婪匹配.*?写出来的表达式简练一些。
1. syslog解析
syslog常用来记录设备(网络设备/主机)的状态改变信息,如网络接口的状态、主机系统的状态事件等,如下是网络设备接口宕掉后产生的一条syslog事件:
2011 Mar 24 11:51:48 CHN: %ETHPORT-5-IF_DOWN_LINK_FAILURE: Interface Ethernet13/29 is down (Link failure)
由于syslog事件的内容生涩,故通过正则表达式解析并提取指定的字符串,标准化成清晰可读的事件,如下是通过NMS的标准化后的事件内容:
协议宕在节点 XXX.XXX.17.98的接口Ethernet13/29, 状态为down,发生时间2011 Mar 24 11:51:48,故障类型:%ETHPORT-5-IF_DOWN_LINK_FAILURE
在上述的标准事件中,提取了原始syslog中部分字符串(红色字体部分)。
1)syslog正则表达式实现

模式匹配以元字符来匹配字符串文本,如下介绍使用转义字符的方式来使用正则元字符,转义字符通常是一个反斜线\加上一个字母组成。
使用括号()将匹配结果标记为一个group。
完整的正则表达式如下:
(\d+\s+\w+\s+\d+\s+\d+:\d{2}:\d{2})\s+\w+.\s+(\S+):\s+\S+\s+(\S+)\s+is\s+(\S+)(.*|\s)+?
2)RegexBuddy测试效果
Group1、2、3、4、5分别表示字符串中需要的引用,如下图:

2. 巡检结果匹配
在巡检产品中,需要对巡检命令的输出结果做正则分析,析取出指定的内容,如下是Linux平台查看CPU使用情况的巡检命令及输出:

1)解析实现
这里需要匹配Average一行的%system列的值0.02以及%iowait的值0.00,这里可以用如下正则表达式写法:

[0-9]+等价于\d+ 表示匹配0到9之间的任意一个数字,+表示匹配1个或多个,{2}表示匹配两个结果。
完整的表达式如下:Average:\s+[0-9]+.[0-9]{2}\s+[0-9]+.[0-9]{2}
2)RegexBuddy测试效果
圆括号()用来标记group,并以数字按序引用。在自动巡检中,使用JavaScripts分析正则表达式,故使用$1和$2表示第一个和第二个group。
注:在正则表达式中,最多能引用9个group。
如上述的正则表达式匹配Avarage一行中的%system和%iowait数值。

END
本文作者:董有知
本文来源:IT那活儿(上海新炬王翦团队)





