`

正则表达式find和group详解

    博客分类:
  • Java
阅读更多

正则表达式是一个很好的东西,要使用好得好好研究。最近对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()返回的字符串下匹配的结果。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics