Java的匹配正则表达式Pattern和Matcher

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详解

如果哪里有错误请各位多多包涵~最后~新人求关照~~
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值