java的Pattern和Matcher用于匹配正则表达式,详细的用法见参考文章,本文仅记录一下读后感,加深记忆~~
一、正则表达式的匹配
java匹配字符串一般有3种方法
1、使用String类的matches(String regex)方法
2、使用Pattern的静态方法matches(String regex, CharSequence input)方法
3、使用Pattern和Matcher的结合。
使用Pattern和Matcher结合的一般步骤为:
a、先得到Pattern对象,Pattern p = Pattern.compile("\\d+");
b、得到Matcher对象,Matcher m = p.matcher("12345");
c、调用matches()进行全匹配,m.matches(); //返回boolean类型
那这3个方法有什么不同呢~
看看String类的matches的源代码
public boolean matches(String regex) {
return Pattern.matches(regex, this);
}
可以看到,String类的matches方法调用的是Pattern类的静态方法matches,
然后看看Pattern类的静态方法matches的源代码
public static boolean matches(String regex, CharSequence input) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
return m.matches();
}
可以看到,方法1,2,最终都是调用的都是方法3。
二、Matcher的group()和groupCount()
然后说说Matcher类的group,看名字本以为group是匹配的子字符串有几个就有几组,然而并不是- -
首先看以下代码
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("123abc789efg");
System.out.println(m.find());//输出true
System.out.println(m.groupCount());//输出0
System.out.println(m.group());//输出123
为什么groupCount()返回的是0,不是2,不是有“123”,“789”两组吗。
然后试着调用 m.group(2),返回第二组字符串“789”,出现错误java.lang.IndexOutOfBoundsException: No group 2
调用m.group(1)也同样错误,而调用m.group(0)返回123。
其实,Matcher类的group代表的不是结果的分组,而是跟正则表达式有关,把表达式中的()进行分组,如下代码
Pattern p = Pattern.compile("(\\d+)([a-zA-Z]+)");
Matcher m = p.matcher("123abc456efg789");
System.out.println(m.groupCount());//输出2
while(m.find()){
System.out.println(m.group(0));//第一次输出123abc 第二次输出456efg
System.out.println(m.group(1));//第一次输出123 第二次输出456
System.out.println(m.group(2));//第一次输出abc 第二次输出789
}
这样就很清晰了,
group(0)和group()一样,匹配的是(\\d+)([a-zA-Z]+)
group(1)匹配的是第一个括号中的(\\d)
group(2)匹配的是第二个括号中的([a-zA-Z]+)
然后每次调用m.find()都会找下一个匹配的字符串,并更新group()
结尾~如果是想了解Pattern和Matcher用法的朋友可以参考 java Pattern和Matcher详解
如果哪里有错误请各位多多包涵~最后~新人求关照~~