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