您好,欢迎访问三七文档
正则表达式入门胡张东2014/7太仓市同维电子有限公司引言•使用Everything查找关于正则表达式的ppt,但又不知道该ppt的具体名称,可以使用通配符“*”,*正则表达式*.ppt,这里的“*”表示了任意字符。太仓市同维电子有限公司引言•正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。•说简单点,正则表达式就是在一堆有规律的字符中找到你想要的字符。太仓市同维电子有限公司正则测试工具•推荐大家使用装备软件自带的正则表达式测试工具,在DLL文件夹下的RegexTest.exe太仓市同维电子有限公司一个简单例子在开发装备软件时要检查ProductClass、SSID等,通常都是通过正则表达式在一堆字符中提取出ProductClass,然后和某一个固定的值比较。比如要在一堆字符串中找到ProductClassRG200O-CA,源字符串为:ksdfjProductClasskdfjie:ldfiefRG200O-CAfiesdf,咋一看源字符串没有一点规则可言,但是仔细观查可以看到有ProductClass字符串可供定位,而且我们已知ProductClass格式为RG200O-CA,所以可以用正则表达式“.*ProductClass.*\:.*(\w{6}-\w{2}).*”来匹配。“.”表示匹配除换行符以外的任意字符,“*”表示前面的“.”匹配零次或更多次,“\”是转义符号,表示后面的“:”就表示冒号,没有其它含义,“\w”表示匹配字母或数字或下划线或汉字,“{6}”表示匹配前面的“\w”6次,这个正则表达式输出的结果为小括号里面的内容。太仓市同维电子有限公司一些术语太仓市同维电子有限公司元字符•上一页提到了两个个元字符“\w”和“.”,元字符表示一类特殊的字符。接下来介绍一些其它常用的元字符,这些元字符必须要牢记!代码说明.匹配除换行符以外的任意字符\w匹配字母或数字或下划线或汉字\s匹配任意的空白符\d匹配数字\b匹配单词的开始或结束^匹配字符串的开始$匹配字符串的结束太仓市同维电子有限公司限定符•在前面的例子中使用了“*”和“{6}”限定匹配次数,还有一些其它用于限定匹配次数的。代码/语法说明*重复零次或更多次+重复一次或更多次?重复零次或一次{n}重复n次{n,}重复n次或更多次{n,m}重复n到m次太仓市同维电子有限公司字符集•如果想只匹配aeiou中的一个,使用[aeiou],[0-9]和\d代表的含义相同,同理[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话),[.?!]匹配标点符号(.或?或!)正则表达式解释\d{3}[fg]ood.+\w{3,6}\s{5,}[0-8]?\d\d*匹配0到9之间的数字3次匹配food或者good匹配除换行符外任意字符一次或更多次匹配字母或数字或下划线或汉字3到6次匹配空格5次或者5次以上匹配0到8零次或者一次匹配0到9一次或者更多次太仓市同维电子有限公司分支条件•在中国有一些特殊号码,比如110,119,120,现在我们要匹配这三个号码中的任意一个,可以使用正则表达式“110|120|119”,其中“|”是分支条件,使用“|”可以把不同的表达式分割,只要匹配到其中任意一个即可,匹配是从左到右匹配的,只要匹配到一个就不往下匹配了。•众所周知IP地址每一位都不能大于255,在写匹配IP地址的正则表达式时,首先需要解决的是如何匹配0到255之间的数字!25[0-5]|2[0-4]\d|1\d{2}|\d\d?太仓市同维电子有限公司分组下面是一段Ping返回结果,要求用一个正则表达式取出最小时延、最大时延、平均时延,而且要兼容XP和Win7系统。Win7:最短=1ms,最长=2ms,平均=3msXP:Minimum=1ms,Maximum=2ms,Average=3ms正则表达式Result[0]:Minimum=1ms,Maximum=2ms,Average=3msResult[1]:MinimumResult[2]:1Result[3]:MaximumResult[4]:2Result[5]:AverageResult[6]:3太仓市同维电子有限公司分组•分组组号分配规则:•从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。((25[0-5]|2[0-4]\d|1\d{2}|\d\d?)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|\d\d?)上面的正则表达式使用了“\.”匹配“.”,这里“\”起到了转义的作用,依次类推,可以使用“\?”和“\*”匹配“?”和“*”一个合法的IPv4地址正则表达式太仓市同维电子有限公司反义•有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义代码/语法说明\W匹配任意不是字母,数字,下划线,汉字的字符\S匹配任意不是空白符的字符\D匹配任意非数字的字符\B匹配不是单词开头或结束的位置[^x]匹配除了x以外的任意字符[^aeiou]匹配除了aeiou这几个字母以外的任意字符太仓市同维电子有限公司贪婪当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab,而不能匹配到aab,这被称为贪婪匹配。写出一个正则表达式匹配以a开始,以b结束的字符串a.*b正则表达式是贪婪的!a.*?b太仓市同维电子有限公司懒惰虽然正则是贪婪的,但有时我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。代码/语法说明*?重复任意次,但尽可能少重复+?重复1次或更多次,但尽可能少重复??重复0次或1次,但尽可能少重复{n,m}?重复n到m次,但尽可能少重复{n,}?重复n次以上,但尽可能少重复太仓市同维电子有限公司一些例子听到这可能已经被我绕晕了,如果你没有晕而且还全部掌握了,那么我只能说我讲的太生动了,接下来通过一些例子来巩固下。匹配要求正则表达式格式为2014/4/24的日期\d{1,4}/(1[0-2]|0?[1-9])/(3[01]|[21]\d|0?[1-9])格式为XX:XX:XX:XX:XX:XX的MAC地址(([0-9a-fA-F]){4}\.){2}(([0-9a-fA-F]){4})格式为XXXX.XXXX.XXXX的MAC地址(([0-9a-fA-F]){2}\:){5}(([0-9a-fA-F]){2})格式为ChinaNet-XXXX的SSID,X采用0-9、a-z、A-ZChinaNet-([0-9a-zA-Z]){4}格式为HGU421Nv3的ProductClass\w{7}\s\w{2}格式为Apr15201420:55:34的编译时间\w{3}\s*(3[01]|[21]\d|0?[1-9])\s*\d{4}\s*(2[0-4]|1\d|0?[1-9]):(60|[1-5]\d|0?[1-9]):(60|[1-5]\d|0?[1-9])正数、负数和小数[+-]?\d+\.\d+以ing结尾的单词\b(\w+)ing\b格式为huzhangdong@twsz.com的姓名(\w+)@twsz.com太仓市同维电子有限公司零宽断言在上一页使用正则表达式\b(\w+)ing\b匹配以ing为结尾的单词,如果源字符串是“reading”,那么匹配出来的结果有两个分组,分组0代表整个表达式reading,分组1是小括号(\w+)里面的内容read,如果想分组0的结果为read该怎么办?此时就需要用到零宽断言了。什么是零宽断言呢?正则表达式\b(\w+)(?=ing\b)匹配出来的结果是read,(?=ing)是零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式ing,不包含ing。正则表达式(?=read)(\w+)匹配出来的结果是ing,(?=read)是零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式read,不包含read。太仓市同维电子有限公司负向零宽断言匹配一个单词,该单词里面出现了a,但是a后面不是b。\b\w*a[^b]\w*\b上面的正则表达式\b\w*a(?!b)\w*\b使用了负向零宽断言中的零宽度负预测先行断言,正则表达式(?!b)即断言此位置的后面不能匹配表达式bfaccbfaccb\b\w*a[^b]??\w*\bfaccbfa\b\w*a[^b]??\w*\bfabcdefabcde\b\w*a(?!b)\w*\bfabcderegex_searchexecutefail!\b\w*a(?!b)\w*\bfaccbfa太仓市同维电子有限公司负向零宽断言零宽度负预测先行断言:(?!exp),断言此位置的后面不能匹配表达式零宽度负回顾后发断言:(?!exp),断言此位置的前面不能匹配表达式(?![a-z])\d{7}匹配前面不是小写字母的七位数字。
本文标题:正则表达式入门
链接地址:https://www.777doc.com/doc-3383208 .html