您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 统计图表 > Java正则表达式详解
1/37Java正则表达式详解概述:正则表达式:正则表达式是一种可以用于模式匹配和替换的强有力的工具,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(称为元字符)组成的文字模式,它描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。正则表达式在字符数据处理中起着非常重要的作用,我们可以用正则表达式完成大部分的数据分析处理工作,如:判断一个串是否是数字、是否是有效的Email地址,从海量的文字资料中提取有价值的数据等等,如果不使用正则表达式,那么实现的程序可能会很长,并且容易出错。对这点本人深有体会,面对大量工具书电子档资料的整理工作,如果不懂得应用正则表达式来处理,那么将是很痛苦的一件事情,反之则将可以轻松地完成,获得事半功倍的效果。由于本文目的是要介绍如何在JAVA里运用正则表达式,因此对刚接触正则表达式的读者请参考有关资料,在此因篇幅有限不作介绍。一、JAVA对正则表达式的支持:在JDK1.3或之前的JDK版本中并没有包含正则表达式库可供JAVA程序员使用,之前我们一般都在使用第三方提供的正则表达式库,这些第三方库中有源代码开放的,也有需付费购买的,而现时在JDK1.4的测试版中也已经包含有正则表达式库---java.util.regex。java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher:Pattern一个Pattern是一个正则表达式经编译后的表现模式。Matcher一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。以下就分别来看看这两个类:Pattern类:Pattern类的方法如下:staticPatterncompile(Stringregex)将给定的正则表达式编译并赋予给Pattern类2/37staticPatterncompile(Stringregex,intflags)同上,但增加flag参数的指定,可选的flag参数包括:CASEINSENSITIVE,MULTILINE,DOTALL,UNICODECASE,CANONEQintflags()返回当前Pattern的匹配flag参数.Matchermatcher(CharSequenceinput)生成一个给定命名的Matcher对象staticbooleanmatches(Stringregex,CharSequenceinput)编译给定的正则表达式并且对输入的字串以该正则表达式为模开展匹配,该方法适合于该正则表达式只会使用一次的情况,也就是只进行一次匹配工作,因为这种情况下并不需要生成一个Matcher实例。Stringpattern()返回该Patter对象所编译的正则表达式。String[]split(CharSequenceinput)将目标字符串按照Pattern里所包含的正则表达式为模进行分割。String[]split(CharSequenceinput,intlimit)作用同上,增加参数limit目的在于要指定分割的段数,如将limi设为2,那么目标字符串将根据正则表达式分为割为两段。一个正则表达式,也就是一串有特定意义的字符,必须首先要编译成为一个Pattern类的实例,这个Pattern对象将会使用matcher()方法来生成一个Matcher实例,接着便可以使用该Matcher实例以编译的正则表达式为基础对目标字符串进行匹配工作,多个Matcher是可以共用一个Pattern对象的。现在先来看一个简单的例子,再通过分析它来了解怎样生成一个Pattern对象并且编译一个正则表达式,最后根据这个正则表达式将目标字符串进行分割:范例:Replacement.java/**Createdon2005-7-7**TODOTochangethetemplateforthisgeneratedfilegoto*Window-Preferences-Java-CodeStyle-CodeTemplates*/packagecn.itcareers.regex.exercise;importjava.util.regex.Pattern;/***@authorAdministrator**TODOTochangethetemplateforthisgeneratedtypecommentgotoWindow-*Preferences-Java-CodeStyle-CodeTemplates*/3/37publicclassReplacement{publicstaticvoidmain(String[]args)throwsException{//生成一个Pattern,同时编译一个正则表达式Patternp=Pattern.compile([/]+);//用Pattern的split()方法把字符串按/分割String[]result=p.split(Kevinhasseen《LEON》sevealtimes,becauseitisagoodfilm.+/凯文已经看过《这个杀手不太冷》几次了,因为它是一部+好电影。/名词:凯文。);for(inti=0;iresult.length;i++)System.out.println(result[i]);}}输出结果:Kevinhasseen《LEON》sevealtimes,becauseitisagoodfilm.凯文已经看过《这个杀手不太冷》几次了,因为它是一部好电影。名词:凯文。很明显,该程序将字符串按/进行了分段,我们以下再使用split(CharSequenceinput,intlimit)方法来指定分段的段数,程序改动为:String[]result=p.split(Kevinhasseen《LEON》sevealtimes,becauseitisagoodfilm./凯文已经看过《这个杀手不太冷》几次了,因为它是一部好电影。/名词:凯文。,2);这里面的参数2表明将目标语句分为两段。输出结果则为:Kevinhasseen《LEON》sevealtimes,becauseitisagoodfilm.凯文已经看过《这个杀手不太冷》几次了,因为它是一部好电影。/名词:凯文。Matcher类:Matcher方法如下:MatcherappendReplacement(StringBuffersb,Stringreplacement)将当前匹配子串替换为指定字符串,并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个StringBuffer对象里。StringBufferappendTail(StringBuffersb)将最后一次匹配工作后剩余的字符串添加到一个StringBuffer对象里。intend()返回当前匹配的子串的最后一个字符在原目标字符串中的索引位置。intend(intgroup)返回与匹配模式里指定的组相匹配的子串最后一个字符的位置。booleanfind()4/37尝试在目标字符串里查找下一个匹配子串。booleanfind(intstart)重设Matcher对象,并且尝试在目标字符串里从指定的位置开始查找下一个匹配的子串。Stringgroup()返回当前查找而获得的与组匹配的所有子串内容Stringgroup(intgroup)返回当前查找而获得的与指定的组匹配的子串内容intgroupCount()返回当前查找所获得的匹配组的数量。booleanlookingAt()检测目标字符串是否以匹配的子串起始。booleanmatches()尝试对整个目标字符展开匹配检测,也就是只有整个目标字符串完全匹配时才返回真值。Patternpattern()返回该Matcher对象的现有匹配模式,也就是对应的Pattern对象。StringreplaceAll(Stringreplacement)将目标字符串里与既有模式相匹配的子串全部替换为指定的字符串。StringreplaceFirst(Stringreplacement)将目标字符串里第一个与既有模式相匹配的子串替换为指定的字符串。Matcherreset()重设该Matcher对象。Matcherreset(CharSequenceinput)重设该Matcher对象并且指定一个新的目标字符串。intstart()返回当前查找所获子串的开始字符在原目标字符串中的位置。intstart(intgroup)返回当前查找所获得的和指定组匹配的子串的第一个字符在原目标字符串中的位置。一个Matcher实例是被用来对目标字符串进行基于既有模式(也就是一个给定的Pattern所编译的正则表达式)进行匹配查找的,所有往Matcher的输入都是通过CharSequence接口提供的,这样做的目的在于可以支持对从多元化的数据源所提供的数据进行匹配工作。下面分别来看看各方法的使用:·matches()/lookingAt()/find():一个Matcher对象是由一个Pattern对象调用其matcher()方法而生成的,一旦该Matcher对象生成,它就可以进行三种不同的匹配查找操作:1、matches()方法尝试对整个目标字符展开匹配检测,也就是只有整个目标字符串完全匹配时才返回真值。2、lookingAt()方法将检测目标字符串是否以匹配的子串起始。5/373、find()方法尝试在目标字符串里查找下一个匹配子串。以上三个方法都将返回一个布尔值来表明成功与否。·replaceAll()/appendReplacement()/appendTail():Matcher类同时提供了四个将匹配子串替换成指定字符串的方法:1、replaceAll()2、replaceFirst()3、appendReplacement()4、appendTail()replaceAll()与replaceFirst()的用法都比较简单,请看上面方法的解释。下面主要重点了解一下appendReplacement()和appendTail()方法。appendReplacement(StringBuffersb,Stringreplacement)将当前匹配子串替换为指定字符串,并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个StringBuffer对象里,而appendTail(StringBuffersb)方法则将最后一次匹配工作后剩余的字符串添加到一个StringBuffer对象里。例如,有字符串fatcatfatcatfat,假设既有正则表达式模式为cat,第一次匹配后调用appendReplacement(sb,dog),那么这时StringBuffersb的内容为fatdog,也就是fatcat中的cat被替换为dog并且与匹配子串前的内容加到sb里,而第二次匹配后调用appendReplacement(sb,dog),那么sb的内容就变为fatdogfatdog,如果最后再调用一次appendTail(sb),那么sb最终的内容将是fatdogfatdogfat。样例:MatcherTest.java/**Createdon2005-7-7**TODOTochangethetemplateforthisgeneratedfilegoto*Window-Preferences-Java-CodeStyle-CodeTemplates*/packagecn.itcareers.regex.exercise;importjava.util.regex.Matcher;importjava.util.regex.Patt
本文标题:Java正则表达式详解
链接地址:https://www.777doc.com/doc-5144767 .html