《《T正则表达式》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《T正则表达式》PPT课件.ppt(23页珍藏版)》请在金锄头文库上搜索。
1、正则表达式正则表达式作者:吴进作者:吴进学习目标学习目标 正则表达式简介正则表达式简介 JDK中的正则表达式中的正则表达式包 匹配模式匹配模式 Javascript中的正则表达式中的正则表达式简介简介n nRegularExpressions(Regex)正则表达式是一种用来描述一定数量文本的模式,常用于:字符串匹配、查找和替换。n n正则表达式引擎是一种可以处理正则表达式的软件。通常,引擎是更大的应用程序的一部分。在软件世界,不同的正则表达式并不互相兼容。本教程会集中讨论Perl5类型的引擎,因为这种引擎是应用最广泛的引擎。同时我们也会提到一些和其他引擎的区别。许多近代的引擎都很类似,但不完
2、全一样。JDK中正则表达式简介中正则表达式简介n nStringString类也增加了一些简单的依据正则表达式工类也增加了一些简单的依据正则表达式工作的方法。作的方法。l lbooleanboolean matchesmatches( (StringString regexregex) )l lstringstring replaceAllreplaceAll( (StringString regexregex, ,StringStringreplacement)replacement) n njava.util.regexjava.util.regex包是包是JDKJDK处理正则表达式的包。
3、处理正则表达式的包。主要提供两个类主要提供两个类PatternPattern和和MatcherMatcher。l lPatternPattern代表模式,可以预编译模式串进行多次匹配。代表模式,可以预编译模式串进行多次匹配。l lMatcherMatcher匹配器,代表匹配结果状态机。它可以对目匹配器,代表匹配结果状态机。它可以对目标串进行匹配、测试等调用并返回匹配结果。标串进行匹配、测试等调用并返回匹配结果。使用使用Java测试正则表达式测试正则表达式n nPattern的创建PatternPatternpatternpattern=Ppile(regexPpile(regex); );依据
4、正则表达式串构建一个可以复用的依据正则表达式串构建一个可以复用的“ “模式模式” ”。n nMatcher的创建MatcherMatchermatchermatcher=pattern.matcher(inputpattern.matcher(input););获得的匹配器有各种方法用于判断和获取匹配结果。获得的匹配器有各种方法用于判断和获取匹配结果。Matcher的主要方法的主要方法n nbooleanboolean matches() matches() 尝试对整个目标字符展开匹配检测,尝试对整个目标字符展开匹配检测,尝试对整个目标字符展开匹配检测,尝试对整个目标字符展开匹配检测,也就是只
5、有整个目标字符串完全匹配时才返回真值,等也就是只有整个目标字符串完全匹配时才返回真值,等也就是只有整个目标字符串完全匹配时才返回真值,等也就是只有整个目标字符串完全匹配时才返回真值,等价的方法价的方法价的方法价的方法Pattern.matches(regex,inputPattern.matches(regex,input) ) 。n nMatcherreset()Matcherreset()重设该重设该MatcherMatcher对象。对象。n nMatcherMatcherreset(CharSequencereset(CharSequenceinput)input)重设该重设该Match
6、erMatcher对象并且指定对象并且指定一个新的目标字符串。一个新的目标字符串。n nMatcherMatcherappendReplacement(StringBufferappendReplacement(StringBuffer sb,Stringsb,Stringreplacement)replacement)将当前匹配子串替换为指定字符串,并且将替换后的子串以及其之将当前匹配子串替换为指定字符串,并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个前到上次匹配子串之后的字符串段添加到一个StringBufferStringBuffer对象里。对象里。n nString
7、BufferStringBuffer appendTail(StringBufferappendTail(StringBuffer sbsb) )将最后一次匹配工作后剩将最后一次匹配工作后剩余的字符串添加到一个余的字符串添加到一个StringBufferStringBuffer对象里。类包里的解释是:实对象里。类包里的解释是:实现非终端追加和替换步骤。现非终端追加和替换步骤。n nbooleanbooleanfind()find()尝试在目标字符串里查找下一个匹配子串。尝试在目标字符串里查找下一个匹配子串。n nbooleanboolean find(intfind(intstart)star
8、t)重设重设MatcherMatcher对象,并且尝试在目标字符串对象,并且尝试在目标字符串里从指定的位置开始查找下一个匹配的子串。里从指定的位置开始查找下一个匹配的子串。Matcher的主要方法的主要方法n nStringgroup()Stringgroup()返回当前查找而获得的与组匹配的所有子串内容返回当前查找而获得的与组匹配的所有子串内容n nStringStringgroup(intgroup(intgroup)group)返回当前查找而获得的与指定的组匹配的子串内容返回当前查找而获得的与指定的组匹配的子串内容n nintint groupCountgroupCount()()返回当
9、前查找所获得的匹配组的数量。返回当前查找所获得的匹配组的数量。n nbooleanboolean lookingAtlookingAt()()检测目标字符串是否起始匹配。检测目标字符串是否起始匹配。n nPatternPatternpatternpattern()()返回该返回该MatcherMatcher对象的现有匹配模式,也就是对应的对象的现有匹配模式,也就是对应的PatternPattern对象。对象。n nStringStringreplaceAll(StringreplaceAll(Stringreplacement)replacement)将目标字符串里与既有模式相匹配将目标字符串
10、里与既有模式相匹配的子串全部替换为指定的字符串。的子串全部替换为指定的字符串。n nStringStringreplaceFirst(StringreplaceFirst(Stringreplacement)replacement)将目标字符串里第一个与既有模将目标字符串里第一个与既有模式相匹配的子串替换为指定的字符串。式相匹配的子串替换为指定的字符串。n nintintstart()start()返回当前查找所获子串的开始字符在原目标字符串中的位置。返回当前查找所获子串的开始字符在原目标字符串中的位置。n nintint start(intstart(intgroup)group)返回当前查
11、找所获得的和指定组匹配的子串的第一个字返回当前查找所获得的和指定组匹配的子串的第一个字符在原目标字符串中的位置。符在原目标字符串中的位置。n nintintend()end()返回当前匹配的子串的最后一个字符在原目标字符串中的索引位返回当前匹配的子串的最后一个字符在原目标字符串中的索引位置。置。n nintint end(intend(intgroup)group)返回与匹配模式里指定的组相匹配的子串最后一个字符返回与匹配模式里指定的组相匹配的子串最后一个字符的位置。的位置。匹配模式串匹配模式串n n匹配模式串由各种文字符号构成。匹配模式串由各种文字符号构成。l l文字符号文字符号l l字符集
12、合字符集合l l重复性重复性l l锚定锚定l l单词边界单词边界l l选择符选择符l l组与反向引用组与反向引用l l匹配模式匹配模式l l防止回朔防止回朔l l先前向后查看先前向后查看l l条件测试条件测试l l分组引用分组引用文字符号文字符号n n表示单个字符,正则表达式中无特别限定的字符都表示本来含义。n n不可显示字符l lTabTab,回车,换行等不可显示字符,回车,换行等不可显示字符l lt,r,nt,r,nn n特殊字符,表达式中有特定含义,也称作元字符,用于控制表达式特性的。l l$.|?*+()$.|?*+()字符集合字符集合n n用用括起的字符序列。括起的字符序列。l l
13、abcabc 表示表示a a、b b、c c中的任何一个。中的任何一个。l la-za-z表示表示a-za-z中的任何一个。中的任何一个。l la-zA-Z_0-9a-zA-Z_0-9表示所有字符(含大写)以及下划线和数字中的表示所有字符(含大写)以及下划线和数字中的任何一个任何一个l l“a-“a-zAzA-Z”-Z”=“a-z|A-Z”=“a-z|A-Z”n n取反字符取反字符l l 用于取反,表示不在某个序列的字符。用于取反,表示不在某个序列的字符。l l0-90-9不能是数字。不能是数字。n n字符集合中的元字符字符集合中的元字符l l只有四个只有四个“-”-”,其它为非特殊字符可以直
14、接用。,其它为非特殊字符可以直接用。n n预定义字符类预定义字符类 l ldd代表数字,代表数字,ww代表单词字符,代表单词字符,ss代表空白字符,大写的表示反代表空白字符,大写的表示反义。义。n n任意字符任意字符l l.表示任意字符,但是一般情况下不匹配换行符,可以通过控制表示任意字符,但是一般情况下不匹配换行符,可以通过控制表达式属性要求表达式属性要求. .也能代表换行符。也能代表换行符。重复性重复性n n控制之前的字符、字符集合或者组的重复性。l l? ?:告诉引擎匹配前导字符:告诉引擎匹配前导字符0 0次或一次。事实次或一次。事实上是表示前导字符是可选的。上是表示前导字符是可选的。l
15、 l+ +:告诉引擎匹配前导字符:告诉引擎匹配前导字符1 1次或多次。次或多次。l l* *:告诉引擎匹配前导字符:告诉引擎匹配前导字符0 0次或多次。次或多次。l l min,maxmin,max 表示最少表示最少minmin次,最多次,最多maxmax次,次,33表示表示3 3次,次,0,0,与与* *相同,相同,1,1,与与+ +相同,相同,,1,1与与? ?相同。相同。n n例:0755-81981234的解析重复的贪婪性重复的贪婪性n n正则引擎具备贪婪性,它会试图匹配尽可能多的结果再返回。n n使用?+*控制重复性时会尽量匹配后面的字符,改变贪婪性方式包括l l惰性字符控制,在重复
16、字符后面增加个?号惰性字符控制,在重复字符后面增加个?号n n注意:l lX X*?*?惰性可回朔惰性可回朔 l lX X*+*+贪婪不可回朔贪婪不可回朔POSIX n nPOSIX风格定义l lp(a.matches(pLowerp(a.matches(pLower););n n规范UNIX系统的标准锚定锚定n n表示某个边界的起始和终止位。表示某个边界的起始和终止位。l l 表示字符串开始表示字符串开始l l$ $表示字符串结束表示字符串结束n n在多行模式下在多行模式下 和和$ $可以表示每行的开始和结束可以表示每行的开始和结束n n绝对锚定绝对锚定l lAA只匹配字符串开始位置只匹配字
17、符串开始位置l lZZ只匹配字符串结束位置只匹配字符串结束位置n n单词边界单词边界l lbb表示单词边界,表示单词边界,0 0长度匹配,构成单词的字符之前长度匹配,构成单词的字符之前或之后都匹配,或之后都匹配,l lBB表示非单词边界,不构成单词的字符、空白等都表示非单词边界,不构成单词的字符、空白等都匹配。匹配。matches_find_lookingAtn nfindfind查找子串是否匹配,与查找子串是否匹配,与matchesmatches一起使用有其特定一起使用有其特定问题,注意分析问题,注意分析n nlookingAtlookingAt 查找字符串是否起始匹配查找字符串是否起始匹配
18、Patternp=Ppile(d3,5);Patternp=Ppile(d3,5);Strings=123-34345-234-00;Strings=123-34345-234-00;Matcherm=Matcherm=p.matcher(sp.matcher(s););p(m.matchesp(m.matches();();m.resetm.reset();();p(m.findp(m.find();();p(m.findp(m.find();();p(m.findp(m.find();();p(m.findp(m.find();();p(m.lookingAtp(m.lookingAt()
19、;();p(m.lookingAtp(m.lookingAt();();p(m.lookingAtp(m.lookingAt();();p(m.lookingAtp(m.lookingAt();();start_endn nintstart()返回匹配的初始下标。n nintend()返回最后匹配字符之后的下标。n n注:如果找不到,将报异常String_Replacement 替换替换n nPattern.Pattern.属性属性l lCASE_INSENSITIVECASE_INSENSITIVE 大小写不敏感大小写不敏感l lMULTILINEMULTILINE 多行模式多行模式l lD
20、OTALLDOTALL 点匹配所有模式点匹配所有模式 n n例备注:例备注:javaJavajavaJavaJAVaJAVa JaVaJaVa IloveJAVAIloveJAVA hatejAvAhatejAvA abcdefg.replaceAll(javaabcdefg.replaceAll(java,JAVA),JAVA)l lbooleanboolean findfind() ()/相当于相当于 hasNexthasNext() ()l lStringString groupgroup()()/相当于相当于 next()next()l lStringString replaceAll
21、replaceAll( (StringStringreplacement)replacement)l lStringString replaceFirstreplaceFirst( (StringStringreplacement)replacement)l lMatcherMatcher appendReplacementappendReplacement( (StringBufferStringBuffer sbsb, ,StringStringreplacement)replacement)l lStringBufferStringBuffer appendTailappendTail(
22、 (StringBufferStringBuffer sbsb) )n nflagsflags的简写的简写l lp(JaVa.matches(?i)(javap(JaVa.matches(?i)(java););组组n n使用()分组,可以对分组控制重复性。l l例备注n n原子组表示匹配不成功直接回朔到前一个模式。l l(?abc)d如果匹配ababdabcabcd不成功,不会不断回朔上个字符,而是直接回朔到字符串开头,接着匹配失败。组的向后引用组的向后引用n n数字引用之前定义的组,0引用第一个定义的组、1引用第二个定义的组l l例如:例如:*.*?*.*?n n一个向后引用不能用于它自身
23、l l(abc1)(abc1),不正确不正确n n向后引用不能用于字符集内部l l(a)1b(a)1b,不正确,不正确n n例备注组的向前和向后查看组的向前和向后查看n n向前查看与向后查看,表示先肯定前或后能匹配某内容本模式才匹配,他们是0长度断言,不会消耗字符串长度。l l肯定式向前查看的语法是:肯定式向前查看的语法是:(?=(?=查看的内容查看的内容) )l l否定式向前查看的语法是:否定式向前查看的语法是:(?!(?!查看内容查看内容) )l l肯定式向后查看的语法是:肯定式向后查看的语法是:(?=(?=查看内容查看内容) )l l否定式向后查看的语法是:否定式向后查看的语法是:(?!
24、(?!查看内容查看内容) )l lJSJS中不支持向后查看语法,报错。中不支持向后查看语法,报错。Javascript 正则表达式正则表达式n nJavascriptJavascript使用类使用类RegExpRegExp构建正则表达式。构建正则表达式。l lvarvar regexpregexp=new=newRegExp(“abc”,”igRegExp(“abc”,”ig”);”);n n第一个参数是正则表达式串,第二个是匹配模式控制串,第一个参数是正则表达式串,第二个是匹配模式控制串,这里是忽略大小写,全局搜索。这里是忽略大小写,全局搜索。l l或者使用正则表达式字面表达方式或者使用正则
25、表达式字面表达方式n nVarVar regexpregexp=/=/abc/igabc/ig; ;n nStringString类的多个方法可以直接使用正则表达式工类的多个方法可以直接使用正则表达式工作作l lsearch(/search(/abcabc/) /):找第一个匹配数下标。:找第一个匹配数下标。l lreplace(/replace(/abcabc/,handler)/,handler):找到匹配并执行回调。:找到匹配并执行回调。l lmatch(/match(/abcabc/) /):查找匹配结果,以数组对象返回。:查找匹配结果,以数组对象返回。 l lsplit(/split
26、(/abc/,nabc/,n);按匹配分裂);按匹配分裂n n次。次。Javascript 正则表达式正则表达式n nRegExp的方法和属性l ltest(stest(s); );测试测试s s是否匹配模式。是否匹配模式。l lexec(sexec(s); );得到匹配结果数组对象,含有得到匹配结果数组对象,含有indexindex(匹配起始位)和(匹配起始位)和inputinput(原始输入串)(原始输入串)属性。这个与属性。这个与StringString的的matchmatch方法返回的结果方法返回的结果一样,但是一样,但是matchmatch方法不会影响正则表达式方法不会影响正则表达式的的lastIndexlastIndex属性。属性。l llastIndexlastIndex最后匹配的结束位,使用最后匹配的结束位,使用testtest和和execexec时,如果有全局标志则影响此标记位。时,如果有全局标志则影响此标记位。课后练习课后练习n n练习1:程序统计java源文件,有多少空行、多少有效代码行、多少注释行?n n练习2:针对一个文本文件,识别其中的邮件地址、网址、手机电话号码,该文件有多行。n n练习3:给出一个具有Form的html文件,写出一个函数,要求对指定名称的Form在提交时判断所有Input必须填写,而且必须是长度为8的电话号码,否则不能提交。