Pattern与Matcher合作,Matcher类提供了正则表达式分组支持和正则表达式多次匹配支持。 Pattern只能使用pattern.matcher(stringregex,CharSequence input )中最基础、最简单的匹配。
java正则表达式是通过java.util.regex包中的Pattern和Matcher类实现的。 阅读本文时,如果要打开java API文档并讨论哪些方法,请参阅java API方法的说明,这会很有帮助。
Pattern类用于创建正则表达式。 也就是说,它用于创建匹配模式。 其生成方法是私有的,不能直接创建,但是可以使用Pattern.complie(String regex )的简单工厂方法创建正则表达式。
Java代码示例:
patternp=pattern.compile((w );
p.pattern (; //上一步
pattern ()返回正则表达式的字符串格式,但实际上是返回pattern.complile(stringregex )的regex参数1.pattern.split (charsequenceinput )
Pattern包含用于分隔字符串并返回字符串[ ]的split(charsequenceinput )方法。 我认为string.split(stringregex )是通过pattern.split (char sequence )传递的
Java代码示例:
patternp=pattern.compile('d ' );
String[] str=p.split (我的QQ是:456456我的电话是:0532214我的邮箱地址是:aaa@aaa.com);
结果:str[0]='我的QQ是:' str[1]='我的电话是:' str[2]='我的邮箱地址是:aaa@aaa.com '
2.pattern.matcher(stringregex,CharSequence input )适用于仅匹配一次并匹配所有字符串的静态快速匹配方法。
Java代码示例:
Pattern.Matches('d ',' 2223 ' ); 返回true
Pattern.Matches('d ',' 2223aa ' ); 返回false。 必须匹配所有字符串才能返回true。 在这里,aa是
Pattern.Matches('d ',' 22bb23 ' ); 要返回false并返回true,必须匹配所有字符串。 这里bb与不一致
3.pattern.matcher (charsequenceinput ) )。
说着这些,终于轮到Matcher类登场了。 pattern.matcher (charsequenceinput )返回matcher对象。
Matcher类的构建方法也是私有的,不能自行创建。 只能通过pattern.matcher (charsequenceinput )方法获得类的实例。
Pattern类只能进行简单的匹配操作。 要获得更强大、更方便的正则匹配操作,需要Pattern和Matcher进行协作。 Matcher类提供正则表达式分组支持和正则表达式多次匹配支持。
Java代码示例:
patternp=pattern.compile('d ' );
matcherm=p.matcher(22bb23 );
m.pattern (; 返回//p表示该Matcher对象是哪个Pattern对象创建的
4.Matcher.matches ()/Matcher.lookingAt ) )/Matcher.find ) )。
Matcher类有三种匹配操作方法。 这三种方法都返回布尔型,如果匹配则返回true,否则返回false
matches ()匹配整个字符串,并且仅当整个字符串匹配时返回true
Java代码示例:
patternp=pattern.compile('d ' );
matcherm=p.matcher(22bb23 );
m.matches (; 返回false。 由于bb在d中不匹配,整个字符串的匹配失败。
matcherM2=p.matcher('2223 );
m2.matches (; //由于d与整个字符串匹配,返回true
让我们看看pattern.matcher(stringregex,CharSequence input )。 这等效于以下代码
pattern.compile(regex ).matches (input ).matches ) )。
lookingAt () )与上一个字符串匹配,并且仅当匹配字符串位于开头时返回true
Java代码示例
:Pattern p=Pattern.compile("\d+");
Matcher m=p.matcher("22bb23");
m.lookingAt();//返回true,因为d+匹配到了前面的22
Matcher m2=p.matcher("aa2223");
m2.lookingAt();//返回false,因为d+不能匹配前面的aa
find()对字符串进行匹配,匹配到的字符串可以在任何位置.
Java代码示例:
Pattern p=Pattern.compile("\d+");
Matcher m=p.matcher("22bb23");
m.find();//返回true
Matcher m2=p.matcher("aa2223");
m2.find();//返回true
Matcher m3=p.matcher("aa2223bb");
m3.find();//返回true
Matcher m4=p.matcher("aabb");
m4.find();//返回false
5.Mathcer.start()/ Matcher.end()/Matcher.group()
当使用matches(),lookingAt(),find()执行匹配操作后,就可以利用以上三个方法得到更详细的信息.
start()返回匹配到的子字符串在字符串中的索引位置.
end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置.
group()返回匹配到的子字符串
Java代码示例:
Pattern p=Pattern.compile("\d+");
Matcher m=p.matcher("aaa2223bb");
m.find();//匹配2223
m.start();//返回3
m.end();//返回7,返回的是2223后的索引号
m.group();//返回2223
Mathcer m2=p.matcher("2223bb");
m2.lookingAt();//匹配2223
m2.start(); //返回0,由于lookingAt()只能匹配前面的字符串,所以当使用lookingAt()匹配时,start()方法总是返回0
m2.end(); //返回4
m2.group(); //返回2223
Matcher m3=p.matcher("2223"); //如果Matcher m3=p.matcher("2223bb"); 那么下面的方法出错,因为不匹配返回false
m3.matches(); //匹配整个字符串
m3.start(); //返回0
m3.end(); //返回3,原因相信大家也清楚了,因为matches()需要匹配所有字符串
m3.group(); //返回2223
说了这么多,相信大家都明白了以上几个方法的使用,该说说正则表达式的分组在java中是怎么使用的.
start(),end(),group()均有一个重载方法它们是start(int i),end(int i),group(inti)专用于分组操作,Mathcer类还有一个groupCount()用于返回有多少组.
Java代码示例:
Pattern p=Pattern.compile("([a-z]+)(\d+)");
Matcher m=p.matcher("aaa2223bb");
m.find();//匹配aaa2223
m.groupCount(); //返回2,因为有2组
m.start(1); //返回0 返回第一组匹配到的子字符串在字符串中的索引号
m.start(2); //返回3
m.end(1); //返回3 返回第一组匹配到的子字符串的最后一个字符在字符串中的索引位置.
m.end(2); //返回7
m.group(1); //返回aaa,返回第一组匹配到的子字符串
m.group(2); //返回2223,返回第二组匹配到的子字符串
现在我们使用一下稍微高级点的正则匹配操作,例如有一段文本,里面有很多数字,而且这些数字是分开的,我们现在要将文本中所有数字都取出来,利用java的正则操作是那么的简单.
Java代码示例:
Pattern p=Pattern.compile("\d+");
Matcher m=p.matcher("我的QQ是:456456 我的电话是:0532214 我的邮箱是:aaa123@aaa.com");while(m.find()) {
System.out.println(m.group());
}
输出:456456
0532214
123如将以上while()循环替换成while(m.find()) {
System.out.println(m.group());
System.out.print("start:"+m.start());
System.out.println(" end:"+m.end());
}
则输出:456456start:6 end:12
0532214start:19 end:26
123start:36 end:39现在大家应该知道,每次执行匹配操作后start(),end(),group()三个方法的值都会改变,改变成匹配到的子字符串的信息,以及它们的重载方法,也会改变成相应的信息.
注意:只有当匹配操作成功,才可以使用start(),end(),group()三个方法,否则会抛出java.lang.IllegalStateException,也就是当matches(),lookingAt(),find()其中任意一个方法返回true时,才可以使用.