String html = "<p><span>mytextvalue<br>";
Matcher m = Pattern.compile("<p><span>(.*?)<br>").matcher(html);
System.out.println(m.find()); //true
System.out.println(m.groupCount()); //1
System.out.println(m.group(0)); //<p><span>mytextvalue<br>
System.out.println(m.group(1)); //mytextvalue
另外
// where does m.groupCount come from
m = Pattern.compile("(group1)(group2)(group3)").matcher(html);
System.out.println(m.groupCount()); //3
增加解释说明, 看源码的注释
/**
* Returns the number of capturing groups in this matcher's pattern.
*
* <p> Group zero denotes the entire pattern by convention. It is not
* included in this count.
*
* <p> Any non-negative integer smaller than or equal to the value
* returned by this method is guaranteed to be a valid group index for
* this matcher. </p>
*
* @return The number of capturing groups in this matcher's pattern
*/
public int groupCount() {
return parentPattern.capturingGroupCount - 1;
}
public boolean find() {
int nextSearchIndex = last;
if (nextSearchIndex == first)
nextSearchIndex++;
// If next search starts before region, start it at region
if (nextSearchIndex < from)
nextSearchIndex = from;
// If next search starts beyond region then it fails
if (nextSearchIndex > to) {
for (int i = 0; i < groups.length; i++)
groups[i] = -1;
return false;
}
return search(nextSearchIndex);
}
我模仿了题意,写了测试代码,结果如下
另外
增加解释说明,
看源码的注释
这里说得清楚,
groupCount
返回的是正则表达式的捕获分组的数量(捕获分组和非捕获分组是另外的知识点),groupCount
的结果并不能说明匹配的结果。要执行正则表达式匹配,需要执行
find
动作,看源码这样的才会给
Matcher
内部的成员变量groups
赋值,groups[i] = -1;
这样的之后在我们执行
m.group(1)
的时候我们才能获得捕获分组匹配到的内容。