《正则表达式入门.ppt》由会员分享,可在线阅读,更多相关《正则表达式入门.ppt(20页珍藏版)》请在三一办公上搜索。
1、胡张东 2014/7,引言,使用Everything查找关于正则表达式的ppt,但又不知道该ppt的具体名称,可以使用通配符“*”,*正则表达式*.ppt,这里的“*”表示了任意字符。,引言,正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。说简单点,正则表达式就是在一堆有规律的字符中找到你想要的字符。,正则测试工具,推荐大家使用装备软件自带的正则表达式测试工具,在DLL文件夹下的RegexTest.exe,一个简单例子,在开发装备软件时要检查ProductClass、SSID等,通常都是通过正则表达式
2、在一堆字符中提取出ProductClass,然后和某一个固定的值比较。,比如要在一堆字符串中找到ProductClass RG200O-CA,源字符串为:ksdfjProductClasskdfjie:ldfiefRG200O-CAfiesdf,咋一看源字符串没有一点规则可言,但是仔细观查可以看到有ProductClass字符串可供定位,而且我们已知ProductClass格式为RG200O-CA,所以可以用正则表达式“.*ProductClass.*:.*(w6-w2).*”来匹配。,“.”表示匹配除换行符以外的任意字符,“*”表示前面的“.”匹配零次或更多次,“”是转义符号,表示后面的“:
3、”就表示冒号,没有其它含义,“w”表示匹配字母或数字或下划线或汉字,“6”表示匹配前面的“w”6次,这个正则表达式输出的结果为小括号里面的内容。,一些术语,元字符,上一页提到了两个个元字符“w”和“.”,元字符表示一类特殊的字符。接下来介绍一些其它常用的元字符,这些元字符必须要牢记!,限定符,在前面的例子中使用了“*”和“6”限定匹配次数,还有一些其它用于限定匹配次数的。,字符集,如果想只匹配aeiou中的一个,使用aeiou,0-9和d代表的含义相同,同理a-z0-9A-Z_也完全等同于w(如果只考虑英文的话),.?!匹配标点符号(.或?或!),匹配0到9之间的数字3次,匹配food或者go
4、od,匹配除换行符外任意字符一次或更多次,匹配字母或数字或下划线或汉字3到6次,匹配空格5次或者5次以上,匹配0到8零次或者一次,匹配0到9一次或者更多次,分支条件,在中国有一些特殊号码,比如110,119,120,现在我们要匹配这三个号码中的任意一个,可以使用正则表达式“110|120|119”,其中“|”是分支条件,使用“|”可以把不同的表达式分割,只要匹配到其中任意一个即可,匹配是从左到右匹配的,只要匹配到一个就不往下匹配了。众所周知IP地址每一位都不能大于255,在写匹配IP地址的正则表达式时,首先需要解决的是如何匹配0到255之间的数字!,250-5|20-4d|1d2|dd?,分组
5、,下面是一段Ping返回结果,要求用一个正则表达式取出最小时延、最大时延、平均时延,而且要兼容XP和Win7系统。Win7:最短=1ms,最长=2ms,平均=3msXP:Minimum=1ms,Maximum=2ms,Average=3ms正则表达式,(Minimum|最短)s+=s+(d+)ms,s+(Maximum|最长)s+=s+(d+)ms,s+(Average|平均)s+=s+(d+)ms,每一个小括号括起来的都是一个分组,加上正则表达式本身就是第0个分组,所以共有7个分组,Result0:Minimum=1ms,Maximum=2ms,Average=3msResult1:Mini
6、mumResult2:1Result3:MaximumResult4:2Result5:AverageResult6:3,分组,分组组号分配规则:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。,(250-5|20-4d|1d2|dd?).)3(250-5|20-4d|1d2|dd?),上面的正则表达式使用了“.”匹配“.”,这里“”起到了转义的作用,依次类推,可以使用“?”和“*”匹配“?”和“*”,一个合法的IPv4地址正则表达式,反义,有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义,贪婪,
7、当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab,而不能匹配到aab,这被称为贪婪匹配。,写出一个正则表达式匹配以a开始,以b结束的字符串,a.*b,正则表达式是贪婪的!,a.*?b,懒惰,虽然正则是贪婪的,但有时我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的
8、重复。现在看看懒惰版的例子吧:a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。,一些例子,听到这可能已经被我绕晕了,如果你没有晕而且还全部掌握了,那么我只能说我讲的太生动了,接下来通过一些例子来巩固下。,格式为2014/4/24的日期,d1,4/(10-2|0?1-9)/(301|21d|0?1-9),格式为XX:XX:XX:XX:XX:XX的MAC地址,(0-9a-fA-F)4.)2(0-9a-fA-F)4),格式为的MAC地址,(0-9a-fA-F)2:)5(0-9a-fA-F)2),格式为Chi
9、naNet-XXXX的SSID,X采用0-9、a-z、A-Z,ChinaNet-(0-9a-zA-Z)4,格式为HGU421N v3的ProductClass,w7sw2,格式为Apr 15 2014 20:55:34的编译时间,w3s*(301|21d|0?1-9)s*d4s*(20-4|1d|0?1-9):(60|1-5d|0?1-9):(60|1-5d|0?1-9),正数、负数和小数,+-?d+.d+,以ing结尾的单词,b(w+)ingb,格式为的姓名,(w+),零宽断言,在上一页使用正则表达式b(w+)ingb匹配以ing为结尾的单词,如果源字符串是“reading”,那么匹配出来的
10、结果有两个分组,分组0代表整个表达式reading,分组1是小括号(w+)里面的内容read,如果想分组0的结果为read该怎么办?此时就需要用到零宽断言了。,什么是零宽断言呢?,正则表达式b(w+)(?=ingb)匹配出来的结果是read,(?=ing)是零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式ing,不包含ing。,正则表达式(?=read)(w+)匹配出来的结果是ing,(?=read)是零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式read,不包含read。,负向零宽断言,匹配一个单词,该单词里面出现了a,但是a后面不是b。,bw*abw*b,上面的正
11、则表达式bw*a(?!b)w*b使用了负向零宽断言中的零宽度负预测先行断言,正则表达式(?!b)即断言此位置的后面不能匹配表达式b,fa ccb,fa ccb,bw*ab?w*b,fa ccb,fa,bw*ab?w*b,fabcde,fabcde,bw*a(?!b)w*b,fabcde,regex_search execute fail!,bw*a(?!b)w*b,fa ccb,fa,负向零宽断言,零宽度负预测先行断言:(?!exp),断言此位置的后面不能匹配表达式零宽度负回顾后发断言:(?!exp),断言此位置的前面不能匹配表达式(?!a-z)d7匹配前面不是小写字母的七位数字。,Thanks,