(最新)正则表达式ppt模版课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《(最新)正则表达式ppt模版课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 正则 表达式 ppt 模版 课件
- 资源描述:
-
1、正则表达式-张进平主要内容一正则表达式基本语法二正则表达式的特性和流派概述三正则表达式的匹配原理四正则表达式的使用技巧和性能改善五具体语言(java)中的正则表达式六附录- JavaScript的RegExp对象七参考资料一.正则表达式的基本语法1. 模式(Pattern) 文件名模式(文件名模式(filename Pattern) 在文件系统中提供了某些特殊的字符,作为通配符如:*.txt 等。能找到所有扩展名为txt的文件。在很多系统中都自己系统描述的特定字符,表示特殊的 意义,但是这种描述相当有限-只涉及到文件名。 通用模式语言(通用模式语言(generalized Pattern la
2、nguage) 要处理我们所想到得任何文本,如:报表,散文,诗歌,表格,html,程序代码,单词表等,简单的文件模式显得无能为力。一种新的,功能强大的不同语言以各种方式来实现和使用的模式语言来弥补它的不足。这种通用模式语言和本身被称为“正则表达式正则表达式(regular expression)”2.正则表达式的测试 正则表达式本身不能完成任何工作,它的使用需要有支持正则表达式的宿主语言。以后讲解中我们用java和javascript完成。这里的测试我们用一个支持正则表达式的文本检索器(agrep)来测试。 agrep的下载网站:http:/www.tgries.de/agrep/#DOWNL
3、OAD agrep有各种版本,我这里下了win32的,方便测试也不用安装。 agrep命令格式: agrep “ 正则表达式正则表达式” 文件名文件名 3.正则表达式的组成正则表达式元字符(metachearacter)普通文本(normal text)普通文本就像英语的基本单词而元字符就是它的语法体系正则表达式和文件名模式的区别在于,正则表达式的元字符提供了更强大的描述能力。4.正则表达式的元字符l行的起始和结束 行的起始用脱字符 表示,结束用美元符 $ 表示。 行开始和结束只匹配位置,不指具体文本。 如: cat 表示匹配一个行起始,一个字符c,一个字符a一个 字符t , 意思是匹配以ca
4、t开始的行。 cat$ 表示匹配一个行起始,一个字符c,一个字符a一个 字符t ,一个$ , 意思是匹配只有cat的行。 举例测试 4.正则表达式的元字符l字符组 匹配这里列出来的任何字符。 如:你要检索html标签h1到h6,你可以这么写 h 123456 手机号码前两位可以这么写:1358 再如: 你不确定grey怎么拼,不知道grey 还是gray对 你可以这么检索如:greay举例测试 4.正则表达式的元字符l连字符 - 表示一个范围,在字符组内部的元字符,叫字符组元字字符组元字符。符。 如: 上面的html标签h123456,我们现在可以写成h1-6, 它先匹配一个h,然后再匹配1到
5、6中任意一个字符。 再如:a-z举例测试注意:连字符在字符组的开头不是元字符,只有在中间表示范围的时候才是元字符。其他元字符在字符组内也不是元字符。 4.正则表达式的元字符l排除型字符组 它的意思是匹配除了这里列出的任何字符。 这里的 和行开始是一样的字符。但是意义截然不同。 如: 1-6 意思是除了1到6之外任何字符。 c 表示不是字符c开始的行。举例测试 4.正则表达式的元字符l多选结构或 | 它的意思就是 或(or) 它能任意的子表达式,能把多个字表达式合并。 我们回头看我们的例子greay,在这里我们可以这么 写:grey|gray 也可写成:gr(a|e)y 这里括号也是元字符,它表
6、示我们划定多选结构的范围。 举例测试 4.正则表达式的元字符问题:基于原来上面的问题,请gr(a|e)y,gra|ey,graey 的区别? gra|ey表示的不是我们所需要的东西,因为|在字符组 内不是元字符,它表示的是grey,gr|y,gray中的一 个。gr(a|e)y和graey都能达到我们的目的,但如果你觉得 gr(a|e)y没什么大的用处,那么你错了!他们的本 质区别在于一个是多选结构,一个是字符组,字符 组只能匹配单个字符,多选结构匹配的是完整的分 支结构。举例测试 4.正则表达式的元字符l单词分界符 匹配单词开始,单词结束 如:表示单词开始,然后匹配单词cat,然后匹配单词结
7、束。 有些版本不支持,我用的这个就不支持,而且在java,.net,Perl语言中都是b来表示的,所以我们这里只有用java的b来测试。举例测试java测试PatternTset6.java 4.正则表达式的元字符l可选项 ? 放在一个字符后面表示可选字符,它的出现并非匹配成功的必要条件。 在英语中color和 colour表示的同一个意思,我们检索的时候两个都检索,如下表示。 如:colou?r 注:agrep不支持 “?”符号举例测试java测试 PatternTset.java 4.正则表达式的元字符l其他量词 * 和 + 和?一样,*,+ 他们称作量词,表示出现的次数。 + 表示一次或
8、多次,那么就有了至少一次的限制。 * 表示任意多次或者不出现。因为可以不出现,所以*和?不会影响整个正则表达式的匹配是否成功。他们只会影响匹配的最终结果,也就是匹配成功的字符串。 如正整数我们可以这么写:1-90-9*举例测试java测试 PatternTset.java 4.正则表达式的元字符l区间量词 min,max 表示重复出现的次数。 对上面的正整数做限制条件4位以内的正整数我们可以这么写:1-90-90,3举例测试java测试PatternTest5.java 4.正则表达式的元字符l括号及反向引用 在很多软件和文本工具中,括号能捕获匹配过的字符, 再用1,2这样的字符序列来记住他们
9、。 javaScript测试: var ret = /(d)1$/; var b = ret.test(“22”); alert(b); 有些版本的grep是不支持的,我用的这个就不支持。 有些语言也不支持,但是它支持捕获组和非捕获组的 概念,原理一样,具体看下节。 举例测试 java测试BackRefence.java4.正则表达式的元字符l捕获组和非捕获组 捕获型括号捕获型括号 () 在用括号的时候它会自动记住从左到右从第一个开 括号匹配成功的字符作为第一组,放在一个所谓捕获组的变量里,第二个放在第二个变量里,以此类推。Perl5语言它放在$1,$2,$3中,java语言它也可以放在$1中
10、,也可放在一个叫groups 的数组变量里。每次取的时候就可以直接getgroup(index)来取到。 举例测试 java测试BackRefence.java4.正则表达式的元字符l捕获组和非捕获组 非捕获型括号非捕获型括号 (?:) 括号内的开始加了问号和冒号。 大多数情况下我们并不想捕获匹配数据,这样对我们系统的效率和性能消耗很大。那么我们就可以用非捕获型括号,提高我们的效率。关于正则表达式的效率问题在后面章节里讲解 如: (fffff|dddd)|eeeee) 举例测试 java测试BackRefence.java4.正则表达式的元字符l捕获组和非捕获组 如:有这么个需求,允许客户端数
11、据手机号码或电话号码,还可以是邮箱,我们根据正则表达式可以获得具体是什么,再根据我们捕获到的数据进行后续处 理,如打电话,或发邮件。 举例测试 java测试 groupTset.java4.正则表达式的元字符l转义字符 也许你已经发现,正则表达式里有很多元字符,如果想 检索元字符,那么怎么办,转义字符就是解决这个问题的,如果你想查找 . 这个元字符,那么你应该写成.这种形式。 如:检索 那么我们应该写成:举例测试 4.正则表达式的元字符l其他软件程序中的元字符 d 相当于0-9 D 相当于0-9 w 相当于0-9a-zA-Z_ 这里包括下划线 W 相当于0-9a-zA-Z_ s 包括空格符,回
12、车符,制表符,进纸符等 S 除了所有空白符s外的所有字符 r 回车符制表符t 制表符 n 换行符举例测试 java测试PatternTest3.java4.正则表达式的元字符l环视(lookaround) 它不匹配任何字符,只匹配文本中的特定位置,这一点和单词边界符b,起始符,结束符$很相似。 环视分为四种,如下:肯定型顺序环视 (?=)子表达式能够匹配右侧文本肯定性逆序环视 (?=)子表达式能够匹配左侧文本否定型顺序环视 (?!)子表达式不能匹配右侧文本否定型逆序环视 (?!)子表达式不能匹配左侧文本4.正则表达式的元字符l肯定型顺序环视 如正则表达式Jeffrey匹配 by Jeffrey
13、 friedl时可以成功匹配Jeffrey 而正则表达式(?=Jeffrey)匹配的是如下位置: 这样看着好像没什么意思,也看不出什么作用,现在我们把我们的正则表达式改成(?=Jeffrey)Jeff, 这个时候我们再去匹配这两个行: 1 . by Jeffrey friedl 2 . by Thomas Jefferson4.正则表达式的元字符l肯定型顺序环视 (java测试:PatternTset7.java) 我们会惊奇的发现字符串1被分割了,而字符串2没有被分割。答案很简单,本身字符Jeff是匹配的,只是没匹配环视(?=Jeffrey) ,这样把范围缩小到了Jeffrey,意思是只有J
14、effrey里的Jeff才是我们真正想找的那个字符串,才能真正被匹配。请看下图:肯定型顺序环视图4.正则表达式的元字符l逆序,否定 顺序环视明白了,逆序就很容易了,意思就是当前位置的左边要匹配环视的文本。也就是环视的结果在环视匹配文本的右面。 否定更简单了,肯定就是要环视的测试文本匹配才算成功,否定就是要环视测试的文本和要测试的文本不匹配才算环视匹配成功。5. 元字符-总结起始符,结束符 , $,单词边界符 , b环视符 (?=), (?=), (?!.), (?!.)数量词符号 ?, * , +, max,min字符组,派出字符组 , 连字符,或 - , |捕获型括号,非捕获型括号 (),
15、(?:)反向引用 1, 2 ,.回车,换行 r, n制表符 t单字符,非单字符 w, W数字符,非数字符 d, D空白符,非空白符 s, S二.正则表达式的特性和流派概述1.正则表达式的起源 20世纪40年代两位神经学家Warren McCulloch和Walter Pitts研究出一种模型来描述神经系统的神经元。 20世纪50年代和60年代理论数学界对正则表达式进行了充分研究。 1968年Ken Thompson发表了Regular Expression Search Algorihm描述了正则表达式编译器。该编译器后来成了IBM的Object代码,由此诞生了qed,这种编译器后来成了Uni
16、x中的ed编辑器的基础。 ed的正则表达式随然没qed的先进,但是得到了大规模应用,有条命令叫“g/Regular Expression/p”,读作“Global Regular Expression Print(应用正则表达式全局输出)”,这个实用的功能最终独立成了grep,之后又产生了egrep,agrep-都是grep的扩展。 grep经过漫长的发展形成egrep的同时,其他程序awk,lex,sed也在发展,并添加了新的功能,众多程序员的修改,结果就形成了巨大的迷局。 1986年POSI(Portable Operating SysTem Interface)(可移植操作系统接口)为了
17、理清正则表达式的混乱局面,把长见的正则表达式分为两类Basic Regular Expressions(BREs)和Extended Regular Expressions(EREs).POSI正则表达式流派概览正则表达式特性BREsEREs点号,$,“任意”数量词*+ 和?量词+,?区间量词min,maxmin,max分组()()量词是否作用于括号反向引用1到9多选结构2.各种语言之间的差异在于以下三点:l支持的元字符,以及这些元字符的意义。也就是我们说的流派(flavor)。l正则表达式与语言或工具的“交互“(inteface)方式。譬如如何进行正则表达式的操作,容许进行哪些操作,以及这些
18、操作的目标文本类型。l正则表达式引擎如何将表达式应用到文本中。语言或工具的设计者实现正则表达式方法,对正则表达式能够取得到的结果又重要的影响。若干工具正则表达式流派的简要参考特性ModerngrepModern egrepGNU EmacsTclPerl.NETJava*,$,?,+,|? + |? + |? + |? + |? + | ? + | ? + |分组()()()()()()(?:)单词分界符bBn M Yb B b B b Bw,W反向引用程序设计语言3种处理正则表达式的方式:l集成式(integrated)l程序式(procedural)l面向对象式(object-orient
19、ed) 第一种方式中,正则表达式是直接内建在语言中的,Perl就是如此,在其他两种方式中,正则表达式不属于语言的低级语法。相反,普通的函数接受普通的字符,把他们当做正则表达式进行处理。由不同的的函数进行不同的、关系到一个或多个正则表达式的操作。大多数语言(不包括Perl)PHP,Java,.net,Python,Ruby等采用的是这两种方式之一。Perl(一种脚本语言)例子:$/ = “.n”;while() next if !s/b(a-z+)(?:s|+)+)(1b)/e7m$1em$2e7m$3em/ig; s/(?:e*n)+/mg; s/$ARGV:/mg; Print; 这里并不奢
20、望能看懂上面代码,何况我们不懂Perl,就算懂Perl的人也未必一下看的明白,只想用这个例子说明不同语言对正则表达式的交互方式程度的不同。在这里给我们的感觉就是正则表达式和程序代镶嵌很紧,所谓正则表达式和代码搭配天衣无缝,正因为正则表达式找到了Perl这块肥土,才让正则表达式在Perl里显得相当出色。java例子:public static void main(String args) Pattern p = Ppile(b n +#把捕获到得地址保存到$1. n +( n +w-.w* n + n + -w+(.-w+)*.(com|edu|info) n +) n +b n,Pattern
21、.CASE_INSENSITIVE|Pattern.COMMENTS);Matcher m = p.matcher(text);text = m.replaceAll($1); System.out.println(text);java例子: 看如上代码,你发现,元字符w写成了w,这是因为java把所有正则表达式都做字符串输入,在程序代码里他不认识w是什么,这么写也会报错误。 注意:这里的换行”n”,是java里的转义字符,不属于正则表达式的内容。这里加换行的目有两个:一让我的代码看的更清楚,二是正则表达式#开始的为注释行,不换行的话都属于注释部分了。 测试(EmailChange.java)
22、 分析代码作用。通过Perl和java代码的对比,我们看到语言之间正则表达式运用的差异,也看出集成式和程序式及面向对象式之间的差别。2.正则表达式匹配模式:l不区分大小写的匹配模式。(忽略大小写)l宽松排列和注释模式。(忽略制表符空格等)l点号通配模式(单行模式)。(点号可以匹配换行等)l增强的行锚点模式(多行模式)。(行锚点符能匹配任何行终止符)l文字文本模式。(不认识任何元字符,全部当简单字符串处理,不当做正则表达处理)3.常见元字符和特性(略) 第一节讲了最常用的元字符,其实还有很多元字符的定义规则特性及其用法,如Unicode字符集,POSIX字符集,模式修饰符等。有兴趣的同学可以去看
23、下资料: Mastering Regular Expressiongs,3rd Edition 美Jeffref E.F. Friedl 精通正则表达式第三版 余晟 译4.总结l 发展起源l 软件工具和语言支持情况l 各种程序设计支持的差异l 正则编译的模式下面我们接着讲 第三节第三节 正则表达式的匹配原理正则表达式的匹配原理三.正则表达式的匹配原理1. 引擎 汽车引擎燃油发动机符合排放的燃油发动机电动发动机 不符合排放标准符合排放标准符合排放标准1.引擎 最初正则引擎和汽车引擎一样,分为两种,DFA(相当于电动机)和NAF(相当于汽油机)。后来,NFA和DFA都发展了20多年了,产生了一些变
24、体,POSIX标准出台后(相当于出了排放标准),DFA是符合POSIX的,而NFA是不符合的,所以出现了修改后符合POSIX的 NFA。这样一来正则引擎和汽车引擎的例子很相似,大概分为三种:l DFA(符合POSIX标准)-电动机l 传统NFA(不符合POSIX)-汽油机l POSIX NFA (符合POSIX)-符合排放的汽油机1.引擎部分程序及其使用的正则引擎DFAAwk(大多数版本),egrp(大多数版本),flex,lex,MySQL传统NFA GNU Emacs,Java,grep,.net,Perl,PHP,Ruby,PythonPOSI NFA Mawk,GUNEmas(明确指定
25、时使用)DFA/NFA GUN awk,GNU grep/egrep,Tcl1.引擎 测试引擎类型 传统型NFA是广泛使用的,且很好区分,如果支持忽略优先量词。那么它就是传统型NFA(Java是支持忽略优先量词的,Java API明确说明是传统的NFA正则引擎,可查看API)。 是DFA还是POSIX NFA DFA不支持捕获型括号和回溯,这一点可以明确判断DFA还是POSIX NFA,不过有双引擎的就列外了。 2.匹配基础 匹配的两条规则:l 优先选择最左端(最开头)的匹配结果。优先选择最左端(最开头)的匹配结果。l 标准匹配量词(标准匹配量词(*,+,?,?,m,n )是匹配优先)是匹配优
展开阅读全文