正则表达式中Pattern类、Matcher类和matches()⽅法简析
1.简介:
是⼀个⽤正则表达式所订制的模式来对字符串进⾏匹配⼯作的类库包。它包括两个类:Pattern和Matcher 。
regex匹配Pattern:⼀个Pattern是⼀个正则表达式经编译后的表现模式。
Matcher:⼀个Matcher对象是⼀个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。
⾸先⼀个Pattern实例订制了⼀个所⽤语法与PERL的类似的正则表达式经编译后的模式,然后⼀个Matcher实例在这个给定的Pattern实例的模式控制下进⾏字符串的匹配⼯作。
以下我们就分别来看看这两个类:
2.Pattern类:
static Pattern compile(String regex) 将给定的正则表达式编译并赋予给Pattern类 static Pattern compile(String regex, int flags) 同上,但增加flag参数的指定,可选的flag参数包括:CASE INSENSIT
IVE,MULTILINE,DOTALL,UNICODE CASE, CANON EQ int flags() 返回当前Pattern的匹配flag参数. Matcher matcher(CharSequence input) ⽣成⼀个给定命名的Matcher对象 static boolean matches(String regex, CharSequence input) 编译给定的正则表达式并且对输⼊的字串以该正则表达式为模开展匹配,该⽅法适合于该正则表达式只会使⽤⼀次的情况,也就是只进⾏⼀次匹配⼯作,因为这种情况下并不需要⽣成⼀个Matcher实例。 String pattern() 返回该Patter对象所编译的正则表达式。 String[] split(CharSequence input) 将⽬标字符串按照Pattern⾥所包含的正则表达式为模进⾏分割。 String[]
split(CharSequence input, int limit) 作⽤同上,增加参数limit⽬的在于要指定分割的段数,如将limi设为2,那么⽬标字符串将根据正则表达式分为割为两段。⼀个正则表达式,也就是⼀串有特定意义的字符,必须⾸先要编译成为⼀个Pattern类的实例,这个Pattern对象将会使⽤matcher()⽅法来⽣成⼀个Matcher实例,接着便可以使⽤该 Matcher实例以编译的正则表达式为基础对⽬标字符串进⾏匹配⼯作,多个Matcher是可以共⽤⼀个Pattern对象的。现在我们先来看⼀个简单的例⼦,再通过分析它来了解怎样⽣成⼀个Pattern对象并且编译⼀个正则表达式,最后根据这个正则表达式将⽬标字符串进⾏分割:import *; public class Replacement{ public static void
main(String[] args) throws Exception { // ⽣成⼀个Pattern,同时编译⼀个正则表达式 Pattern p = Patternpile("[/]+"); //⽤Pattern的split()⽅法把字符串按"/"分割 String[] result = p.split( "Kevin has
seen《LEON》seveal times,because it is a good film." +"/ 凯⽂已经看过《这个杀⼿不太冷》⼏次了,因为它是⼀部" +"好电影。/名词:凯⽂。"); for (int i=0; i<result.length; i++) System.out.println(result[i]); } } 输出结果为: Kevin has seen《LEON》seveal times,because it is a good film. 凯⽂已经看过《这个杀⼿不太冷》⼏次了,因为它是⼀部好电影。名词:凯⽂。很明显,该程序将字符串按"/"进⾏了分段。我们以下再使⽤ split(CharSequence input, int limit)⽅法来指定分段的段数,程序改动为: tring[] result = p.split("Kevin has seen《LEON》seveal times,because it is a good film./ 凯⽂已经看过《这个杀⼿不太冷》⼏次了,因为它是⼀部好电影。/名词:凯⽂。",2); 这⾥⾯的参数"2"表明将⽬标语句分为两段。输出结果则为: Kevin has seen《LEON》seveal times,because it is a good film. 凯⽂已经看过《这个杀⼿不太冷》⼏次了,因为它是⼀部好电影。/名词:凯⽂。
3.Matcher类:
Matcher⽅法如下: Matcher appendReplacement(StringBuffer sb, String replacement) 将当前匹配⼦串替换为指定字符串,并且将替换后的⼦串以及其之前到上次匹配⼦串之后的字符串段添加到⼀个StringBuffer对象⾥。 StringBuffer appendTail(StringBuffer sb) 将最后⼀次匹配⼯作后剩余的字符串添加到⼀个StringBuffer对象⾥。 int end() 返回当前匹配的⼦串的最后⼀个字符在原⽬标字符串中的索引位置。int end(int group) 返回与匹配模式⾥指定的组相匹配的⼦串最后⼀个字符的位置。 boole
an find() 尝试在⽬标字符串⾥查下⼀个匹配⼦串。 boolean find(int start) 重设Matcher对象,并且尝试在⽬标字符串⾥从指定的位置开始查下⼀个匹配的⼦串。 String group() 返回当前查⽽获得的与组匹配的所有⼦串内容 String group(int group) 返回当前查⽽获得的与指定的组匹配的⼦串内容 int groupCount() 返回当前查所获得的匹配组的数量。 boolean lookingAt() 检测⽬标字符串是否以匹配的⼦串起始。 boolean matches() 尝试对整个⽬标字符展开匹配检测,也就是只有整个⽬标字符串完全匹配时才返回真值。 Pattern pattern() 返回该Matcher对象的现有匹配模式,也就是对应的Pattern 对象。 String replaceAll(String replacement) 将⽬标字符串⾥与既有模式相匹配的⼦串全部替换为指定的字符串。 String replaceFirst(String replacement) 将⽬标字符串⾥第⼀个与既有模式相匹配的⼦串替换为指定的字符串。 Matcher reset() 重设该Matcher 对象。 Matcher reset(CharSequence input) 重设该Matcher对象并且指定⼀个新的⽬标字符串。 int start() 返回当前查所获⼦串的开始字符在原⽬标字符串中的位置。 int start(int group) 返回当前查所获得的和指定组匹配的⼦串的第⼀个字符在原⽬标字符串中的位置。(光看⽅法的解释是不是很不好理解?不要急,待会结合例⼦就⽐较容易明⽩了)
⼀个Matcher实例是被⽤来对⽬标字符串进⾏基于既有模式(也就是⼀个给定的Pattern所编译的正则表达式)进⾏匹配查的,所有往Matcher的输⼊都是通过CharSequence接⼝提供的,这样做的⽬的在于可以⽀持对从多元化的数据源所提供的数据进⾏匹配⼯作。我们分别来看看各⽅法的使⽤:
★matches()/lookingAt ()/find():⼀个Matcher对象是由⼀个Pattern对象调⽤其matcher()⽅法⽽⽣成的,⼀旦该Matcher对象⽣成,它就可以进⾏三种不同的匹配查操作: matches()⽅法尝试对整个⽬标字符展开匹配检测,也就是只有整个⽬标字符串完全匹配时才返回真值。lookingAt ()⽅法将检测⽬标字符串是否以匹配的⼦串起始。 find()⽅法尝试在⽬标字符串⾥查下⼀个匹配⼦串。以上三个⽅法都将返回⼀个布尔值来表明成功与否。
★replaceAll ()/appendReplacement()/appendTail(): Matcher类同时提供了四个将匹配⼦串替换成指定字符串的⽅法: replaceAll() replaceFirst() appendReplacement() appendTail() replaceAll()与replaceFirst()的⽤法都⽐较简单,请看上⾯⽅法的解释。我们主要重点了解⼀下appendReplacement()和appendTail()⽅法。 appendReplacement(StringBuffer sb, String replacement) 将当前匹配⼦串替换为指定字符串,并且将替换后的⼦串以及其之前到上次匹配⼦串之后的字符串段添加到⼀个StringBuffer对象⾥,⽽appendTail(StringBuffer sb) ⽅法则将最后⼀次匹配⼯作后剩余的字符串添加到⼀个StringBuffer对象⾥。例如,有字符串fatcatfatcatfat,假设既有正则表达式模式为"cat",
第⼀次匹配后调⽤appendReplacement(sb,"dog"),那么这时StringBuffer sb的内容为fatdog,也就是fatcat中的cat被替换为dog并且与匹配⼦串前的内容加到sb⾥,⽽第⼆次匹配后调⽤appendReplacement(sb,"dog"),那么sb的内容就变为fatdogfatdog,如果最后再调⽤⼀次appendTail
(sb),那么sb最终的内容将是fatdogfatdogfat。还是有点模糊?那么我们来看个简单的程序: //该例将把句⼦⾥的"Kelvin"改为"Kevin" import *; public class MatcherTest{ public static void main(String[] args) throws Exception { //⽣成Pattern对象并且编译⼀个简单的正则表达式"Kelvin" Pattern p = Patternpile("Kevin"); //⽤Pattern类的matcher()⽅法⽣成⼀个Matcher对象 Matcher m = p.matcher("Kelvin Li and Kelvin Chan are both working in Kelvin Chen's KelvinSoftShop company"); StringBuffer sb = new StringBuffer(); int i=0; //使⽤find()⽅法查第⼀个匹配的对象 boolean result = 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.appendTail(sb)后sb的最终内容是:"+ sb.toString()); } } 最终输出结果为:第1次匹配后sb的内容是:Kevin 第2次匹配后sb的内容是:Kevin Li and Kevin 第3次匹配后sb的内容是:Kevin Li and Kevin Chan are both working in Kevin 第4次匹配后sb的内容是:Kevin Li and Kevin Chan are both working in Kevin Chen's Kevin 调⽤m.appendTail(sb)后sb的最终内容是:Kevin Li and Kevin Chan are both working in Kevin Chen's KevinSoftShop company. 看了上⾯这个例程是否对appendReplacement(),appendTail()两个⽅法的使⽤更清楚呢,如果还是不太肯定最好⾃⼰动⼿写⼏⾏代码测试⼀下。
★group()/group(int group)/groupCount():该系列⽅法与我们在上篇介绍的Jakarta-ORO中的MatchResult .group()⽅法类似(有关Jakarta-ORO请参考上篇的内容),都是要返回与组匹配的⼦串内容,下⾯代码将很好解释其⽤法: import *; public class GroupTest{ public static void main(String[] args) throws Exception { Pattern p = Patternpile("(ca)(t)"); Matcher m = p.matcher("one cat,two cats in the yard"); StringBuffer sb = new StringBuffer(); boolean result = m.find(); System.out.println("该次查获得匹配组的数量为:"+m.groupCount()); for(int i=1;i<=m } } 输出为:该次查获得匹配组的数量为:2 第1组的⼦串内容为:ca 第2组的⼦串内容为:t 4.matches():⽅法
java.lang包中的String类,包中的Pattern,Matcher类中都有matches()⽅法。都与正则表达式有关。下⾯我分别举例:(字符串:"abc",正则表达式: "[a-z]{3}")
String类的⽅法: boolean b = "abc".matches("[a-z]{3}" System.out.println(b);
Pattern类中的⽅法: boolean b = Pattern.matches("[a-z]{3}","abc"); System.out.println(b);
Matcher类中的⽅法: Pattern p = Patternpile("[a-z]{3}"); Matcher m = p.matcher("acc"); boolean b =m.matches() System.out.println(b);得到的结果都为true。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论