




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、java.util.regex 是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。1 .简介:java.util.regex 是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:PatternftMatcherPattern 一个 Pattern 是一个正则表达式经编译后的表现模式。Matcher 一个 Matcher 对象是一个状态机器, 它依据 Pattern 对象做为匹配模式对字符串展开匹配检查。首先一个 Pattern 实例订制了一个所用语法与 PERL 勺类似的正则表达式经编译后的模式, 然后一个 Matcher 实例在这个给定的 Pattern
2、实例的模式控制下进行字符串的匹配工作。以下我们就分别来看看这两个类:2 .Pattern 类:Pattern 的方法如下:staticPatterncompile(Stringregex)将给定的正则表达式编译并赋予给 Pattern 类staticPatterncompile(Stringregex,intflags)同上,但增加 flag 参数的指定,可选的 flag 参数包括:CASEINSENSITIVE,MULTILINE,DOTALL,UNICODE,CACANONEQintflags()返回当前 Pattern 的匹配 flag 参数.Matchermatcher(CharSeq
3、uenceinput)生成一个给定命名的 Matcher 对象staticbooleanmatches(Stringregex,CharSequenceinput)编译给定的正则表达式并且对输入的字用以该正则表达式为模开展匹配,该方法适合于该正则表达式只会使用一次的情况,也就是只进行一次匹配工作,因为这种情况下并不需要生成一个 Matcher 实例。Stringpattern()返回该 Patter 对象所编译的正则表达式。Stringsplit(CharSequenceinput)将目标字符串按照 Pattern 里所包含的正则表达式为模进行分割。Stringsplit(CharSequen
4、ceinput,intlimit)作用同上,增加参数 limit 目的在于要指定分割的段数,如将 limi 设为 2,那么目标字符串将根据正则表达式分为割为两段。一个正则表达式,也就是一申有特定意义的字符,必须首先要编译成为一个Pattern 类的实例,这个 Pattern 对象将会使用 matcher()方法来生成一个 Matcher实例,接着便可以使用该 Matcher 实例以编译的正则表达式为基础对目标字符用进行匹配工作,多个 Matcher 是可以共用一个 Pattern 对象的。现在我们先来看一个简单的例子,再通过分析它来了解怎样生成一个 Pattern 对象并且编译一个正则表达式,
5、最后根据这个正则表达式将目标字符串进行分割:复制代码代码如下:importjava.util.regex.*;publicclassReplacementpublicstaticvoidmain(Stringargs)throwsException/生成一个 Pattern,同时编译一个正则表达式Patternp=Ppile(/+);用 Pattern 的 split()方法把字符串按/分割Stringresult=p.split(KevinhasseenLEONsevealtimes,becauseitisagoodfilm.+/凯文已经看过这个杀手不太冷几次了,因为它是一部+”好电影。/名
6、词:凯文。);for(inti=0;isevealtimes,becauseitisagoodfilm.凯文已经看过这个杀手不太冷几次了,因为它是一部好电影。名词:凯文。很明显,该程序将字符串按/”进行了分段,我们以下再使用 split(CharSequenceinput,intlimit)方法来指定分段的段数,程序改动为:tringresult=p.split(KevinhasseenLEONsevealtimes,becauseitisagoodfilm./凯文已经看过这个杀手不太冷几次了,因为它是一部好电影。/名词:凯文。,2);这里面的参数2表明将目标语句分为两段。输出结果则为:Kev
7、inhasseenLEONsevealtimes,becauseitisagoodfilm.凯文已经看过这个杀手不太冷几次了,因为它是一部好电影。/名词:凯文。由上面的例子,我们可以比较出 java.util.regex 包在构造 Pattern 对象以及编译指定的正则表达式的实现手法与我们在上一篇中所介绍的 Jakarta-ORO 包在完成同样工作时的差别, Jakarta-ORO 包要先构造一个 PatternCompiler 类对象接着生成一个Pattern 对象,冉将正则表达式用该 PatternCompiler 类的 compile。方法来将所需的正则表达式编译赋予 Pattern
8、类:PatternCompilerorocom=newPerl5Compiler();Patternpattern=pile(REGULAREXPRESSIONS);PatternMatchermatcher=newPerl5Matcher();但是在 java.util.regex 包里,我们仅需生成一个 Pattern 类,直接使用它的 compile()方法就可以达到同样的效果:Patternp=Ppile(/+);因此似乎 java.util.regex 的构造法比 Jakarta-ORC为简洁并容易理解。3 .Matcher 类:Matcher 方法如下:MatcherappendR
9、eplacement(StringBuffersb,Stringreplacement)将当前匹配子用替换为指定字符用,并且将替换后的子用以及其之前到上次匹配子用之后的字符串段添加到一个 StringBuffer 对象里。StringBufferappendTail(StringBuffersb)将最后一次匹配工作后剩余的字符串添加到一个 StringBuffer 对象里。intend()返回当前匹配的子用的最后一个字符在原目标字符串中的索引位置。intend(intgroup)返回与匹配模式里指定的组相匹配的子用最后一个字符的位置。booleanfind()尝试在目标字符串里查找下一个匹配子
10、用。booleanfind(intstart)重设 Matcher 对象, 并且尝试在目标字符串里从指定的位置开始查找下一个匹配的子用。Stringgroup()返回当前查找而获得的与组匹配的所有子用内容Stringgroup(intgroup)返回当前查找而获得的与指定的组匹配的子用内容intgroupCount()返回当前查找所获得的匹配组的数量。booleanlookingAt()检测目标字符串是否以匹配的子用起始。booleanmatches()尝试对整个目标字符展开匹配检测,也就是只有整个目标字符串完全匹配时才返回真值。Patternpattern()返回该 Matcher 对象的现
11、有匹配模式,也就是对应的 Pattern 对象。StringreplaceAll(Stringreplacement)将目标字符串里与既有模式相匹配的子用全部替换为指定的字符申。StringreplaceFirst(Stringreplacement)将目标字符串里第一个与既有模式相匹配的子用替换为指定的字符串。Matcherreset()重设该 Matcher 对象。Matcherreset(CharSequenceinput)重设该 Matcher 对象并且指定一个新的目标字符串。intstart()返回当前查找所获子用的开始字符在原目标字符串中的位置。intstart(intgroup)
12、返回当前查找所获得的和指定组匹配的子用的第一个字符在原目标字符串中的位置。(光看方法的解释是不是很不好理解?不要急,待会结合例子就比较容易明白了)一个 Matcher 实例是被用来对目标字符串进行基于既有模式(也就是一个给定的Pattern 所编译的正则表达式)进彳 T 匹配查找的,所有往 Matcher 的输入都是通过CharSequence 接口提供的,这样做的目的在于可以支持对从多元化的数据源所提供的数据进行匹配工作。我们分别来看看各方法的使用:matches()/lookingAt()/find():一个 Matcher 对象是由一个 Pattern 对象调用其 matcher()方法
13、而生成的,一旦该Matcher 对象生成,它就可以进行三种不同的匹配查找操作:matches。方法尝试对整个目标字符展开匹配检测,也就是只有整个目标字符串完全匹配时才返回真值。lookingAt()方法将检测目标字符串是否以匹配的子用起始。巾 nd()方法尝试在目标字符串里查找下一个匹配子用。以上三个方法都将返回一个布尔值来表明成功与否。replaceAll()/appendReplacement()/appendTail()Matcher 类同时提供了四个将匹配子用替换成指定字符串的方法:replaceAll()replaceFirst()appendReplacement()appendT
14、ail()replaceAll()WreplaceFirst()的用法都比较简单,请看上面方法的解释。我们主要重点了解下 appendReplacement()ftappendTail()?!r 法。appendReplacement(StringBuffersb,Stringreplacement)将当前匹配子用替换为指定字符串,并且将替换后的子用以及其之前到上次匹配子串之后的字符串段添加至 U 一个StringBuffer 对象里,而 appendTail(StringBuffersb)方法贝 U 将最后一次匹配工作后剩余的字符串添加到一个 StringBuffer 对象里。例如,有字符串
15、 fatcatfatcatfat,假设既有正则表达式模式为cat,第一次匹配后调用appendReplacement(sb,dog)那么这时 StringBuffersb 的内容为 fatdog,也就是 fatcat中的 cat 被替换为 dog 并且与匹配子用前的内容加到 sb 里,而第二次匹配后调用appendReplacement(sb,dog),那么sb的内容就变为fatdogfatdog,如果最后再调用一次appendTail(sb),那么 sb 最终的内容将是 fatdogfatdogfat。还是有点模糊?那么我们来看个简单的程序:/该例将把句子里的Kelvin改为Kevinimp
16、ortjava.util.regex.*;publicclassMatcherTestpublicstaticvoidmain(Stringargs)throwsException生成 Pattern 对象并且编译一个简单的正则表达式KelvinPatternp=Ppile(Kevin);用 Pattern 类的 matcher()方法生成一个 Matcher 对象Matcherm=p.matcher(KelvinLiandKelvinChanarebothworkinginKelvinChensKelvinSoftShopcompany);StringBuffersb=newStringBu
17、ffer();inti=0;使用 find()方法查找第一个匹配的对象booleanresult=m.find();/使用循环将句子里所力的 kelvin 找出并替换再将内容加到 sb 里while(result)i+;m.appendReplacement(sb,Kevin);System.out.println(第+i+”次匹配后 sb 的内容是:+sb);/继续查找下一个匹配对象result=m.find();)/最后调用 appendTail(方法将最后一次匹配后的剩余字符串加到 sb 里;m.appendTail(sb);System.out.println(调用 m.appendT
18、ail(sb 后 sb 的最终内容是:+sb.toString();)最终输出结果为:第 1 次匹配后 sb 的内容是:Kevin第 2 次匹配后 sb 的内容是:KevinLiandKevin第 3 次匹配后 sb 的内容是:KevinLiandKevinChanarebothworkinginKevin第 4 次匹配后 sb 的内容是:KevinLiandKevinChanarebothworkinginKevinChensKevin调用 m.appendTail(sb 后 sb 的最终内容是:KevinLiandKevinChanarebothworkinginKevinChensKev
19、inSoftShopcompany.看了上面这个例程是否对 appendReplacement(),appendTail(M 个方法的使用更清楚呢,如果还是不太肯定最好自己动手写几行代码测试一下。group()/group(intgroup)/groupCount():该系列方法与我们在上篇介绍的 Jakarta-ORO的 MatchResult.group()方法类似(有关 Jakarta-ORO 请参考上篇的内容),都是要返回与组匹配的子用内容,下面代码将很好解释其用法:importjava.util.regex.*;publicclassGroupTestpublicstaticvoid
20、main(Stringargs)throwsExceptionPatternp=Ppile(ca)(t);Matcherm=p.matcher(onecat,twocatsintheyard);StringBuffersb=newStringBuffer();booleanresult=m.find();System.out.println(该次查找获得匹配组的数量为:+m.groupCount();for(inti=1;i=m)输出为:该次查找获得匹配组的数量为:2第 1 组的子用内容为:ca第 2 组的子用内容为:tMatcher 对象的其他方法因比较好理解且由于篇幅有限,请读者自己编程验
21、证。4 .一个检验 Email 地址的小程序:最后我们来看一个检验 Email 地址的例程,该程序是用来检验一个输入的 EMAIL 地址里所包含的字符是否合法,虽然这不是一个完整的 EMAIL 地址检验程序,它不能检验所有可能出现的情况,但在必要时您可以在其基础上增加所需功能。importjava.util.regex.*;publicclassEmailpublicstaticvoidmain(Stringargs)throwsExceptionStringinput=args0;检测输入的 EMAIL 地址是否以非法符号.或作为起始字符Patternp=Ppile(A.1A);Matcherm=p.matcher(input);if(m检测是否以www.为起始p=Ppile(Awww.);m=p.matcher(input);if(m/检测是否包含非法字符p=Ppile(AA-Za-z0-9._-#+);m=p.matcher(input);StringBuffersb=newString
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 屋面光伏支架预埋施工方案
- 河南大型水景施工方案
- 邯郸水泥板围墙施工方案
- 安徽省天一大联考2025届高三3月调研考试历史
- 山东一体化游泳池施工方案
- 塑胶楼地面施工方案
- 桥头修复施工方案范本
- 道路钢筋施工方案
- 森林培育技术发展应用趋势及管理措施的实践分析
- 江苏省泰州市兴化市2024-2025学年九年级上学期期末化学试题(原卷版+解析版)
- 2022年上海高考语文样卷及参考答案
- 国内外钢材牌号对照表
- 一年级下册地方课程教案
- 有趣的仿生设计(课堂PPT)
- 第二章 航空飞行常见疾病
- 个体诊所聘用医师合同范本
- 航运公司开展安全管理体系有效性
- 牛羊定点屠宰厂项目可行性研究报告-甲乙丙资信
- 妊娠糖尿病-杨慧霞.ppt
- 上海机场控制区通行证申请表(人员)
- (完整word版)消化系统知识点整理
评论
0/150
提交评论