资讯专栏INFORMATION COLUMN

正则表达式基础学习笔记

IT那活儿 / 1175人阅读
正则表达式基础学习笔记

点击上方“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-非贪婪模式:

表达式( .*)+?( ) 匹配字符串。

"10103006020" NAME="F5新建连接数" RESCLASS="ResSwitch">

<OID ID="3002" VENDER="F5"/>

KPI>

"10103006021" NAME="F5客户端入流量" RESCLASS="ResSwitch">

<OID ID="3003" VENDER="F5"/>

KPI>

"10103006022" NAME="F5客户端出流量" RESCLASS="ResSwitch">

<OID ID="3004" VENDER="F5"/>

KPI>


如下图:

举例2-贪婪模式:

表达式( .*)+( ),匹配举例1的字符串,如下图:

总结:边界匹配的地方,如xml文件中的,尽量使用简捷的非贪婪匹配.*?特别是对于复杂的表达式来说,采用非贪婪匹配.*?写出来的表达式简练一些。



业务场景实现

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+iss+(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那活儿(上海新炬王翦团队)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129525.html

相关文章

  • JavaScript正则达式学习笔记(二) - 打怪升级

    摘要:本文接上篇,基础部分相对薄弱的同学请移步正则表达式学习笔记一理论基础。正则表达式标志符全局匹配,即找到所有匹配的。方法返回结果的格式不一致问题这个问题上文正则表达式学习笔记一理论基础也有体现,这里再单独拿来说一说,以加深记忆。 showImg(https://segmentfault.com/img/remote/1460000014261596?w=600&h=338); 本文接上篇...

    Jioby 评论0 收藏0
  • es5学习笔记——拜读JavaScript高级程序设计(持续更新)

    摘要:当以非构造函数形式被调用时,等同于。并且,函数执行完毕后,其活动对象不会被销毁,因为匿名函数的作用域链仍然在引用这个活动对象。知道闭包被销毁,创建函数的活动对象才会被回收。 本着尽可能多的完善基础知识,打好基础,做一条有梦想的咸鱼。 1.数据类型 基本数据类型:Undefined,Null,Boolean,Number,String,一种复杂数据类型Object 2.typeof操...

    reclay 评论0 收藏0
  • 正则达式

    摘要:本文内容共正则表达式火拼系列正则表达式回溯法原理学习正则表达式,是需要懂点儿匹配原理的。正则表达式迷你书问世了让帮你生成和解析参数字符串最全正则表达式总结验证号手机号中文邮编身份证地址等是正则表达式的缩写,作用是对字符串执行模式匹配。 JS 的正则表达式 正则表达式 一种几乎可以在所有的程序设计语言里和所有的计算机平台上使用的文字处理工具。它可以用来查找特定的信息(搜索),也可以用来查...

    bang590 评论0 收藏0
  • 重磅 | 完备的 AI 学习路线,最详细的资源整理!

    摘要:是你学习从入门到专家必备的学习路线和优质学习资源。的数学基础最主要是高等数学线性代数概率论与数理统计三门课程,这三门课程是本科必修的。其作为机器学习的入门和进阶资料非常适合。书籍介绍深度学习通常又被称为花书,深度学习领域最经典的畅销书。 showImg(https://segmentfault.com/img/remote/1460000019011569); 【导读】本文由知名开源平...

    荆兆峰 评论0 收藏0
  • js正则达式学习笔记

    摘要:分组小括号功能较多有三种功能,作用一,把单独的项组合成子表达式。作用三,允许后面引用前面的表达式。如果这时的正则表达式是一个非全局的,那么和正则表达式方法拿到的结果相同。,也可以接受一个正则表达式作为参数。 正则表达式创建字面量创建,a = /abc/gim;构造函数创建,a = new RegExp(abc,gim)正则表达式中的特殊字符,[...] 方括号中的任意字符[^...] ...

    superPershing 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<