正则表达式find和group详解

正则表达式是一个很好的东西,要使用好得好好研究。最近对find和group方法比较模糊。经研究记录下笔记。

调用group()方法前,都前要用find方法。否则报错。其实看Matcher类可以看到其中有一个int[] groups;

其实这个数组就是保存group匹配的数据。首先要知道一个正则表达式之后有几组。可通过groupCount()方法得到,其实很简单,是有几对大括号就有几组。例如:

@Test
	public void testLookAhead() {
		Pattern p = Pattern.compile("(\\w{2})(aa)");
		Matcher m = p.matcher("12332aa438aaf");
		Assert.assertEquals(2, m.groupCount());
	}

 有两对大括号那就是两组了。开始看到有帖子说这有三组,把group(0)当成一组,其实group(0)和group()是相等的。然后查看group源代码发现

 public String group(int group) {
        if (first < 0)
            throw new IllegalStateException("No match found");
        if (group < 0 || group > groupCount())
            throw new IndexOutOfBoundsException("No group " + group);
        if ((groups[group*2] == -1) || (groups[group*2+1] == -1))
            return null;
        return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();
    }

 就知道group方法前,一定要find一下了,否则Matcer类中first的初始值是-1.然后调用find方法返回false的时候,first还是false,所有所有的group方法都是要在find方法返回true的情况下,也就是字符串要匹配正则表达式的。

 

然后group(1),group(2).......group(n)都是在group()返回的字符串下匹配的结果。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值