根据捕获分组的数量确定Matcher类中的groups数组的下标最大位数,其计算公式如下所示
下标最大位数=1+捕获分组数量*2;
例如没有捕获分组,那么groups[0]和groups[1]是可用的,group[0]为符合模板字符串的子串的开始位置,groups[1]为符合模板字符串的子串的结束位置+1;其余位置均为默认值-1
若有一个捕获分组时,那么groups[0]和groups[1]是可用的,group[0]为符合模板字符串的子串的开始位置,groups[1]为符合模板字符串的子串的结束位置+1;groups[2]为在之前找到的子串中查找符合捕获分组格式的子串,并把其开始位置(相对于原来字符串的位置)放入groups[2];结束位置的后一位放入groups[3]的位置的,并用oldlast记录group[1]的下标,下次从此位置开始往后找
想获取第n个捕获分组的内容,就group[n]即可,通过n去截取符合全匹配结果的子串中的符合捕获分组条件的子串(位置是相对于原来字符串的位置)
例如存在需要查找的字符串content="1924u1765nkf8976",模板字符串regex="(\\d\\d)\\d{2}"
求group(0)和group(1)的值
package Work;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test05 {
public static void main(String[] args) {
check("1924u1765nkf8976","(\\d\\d)\\d{2}");
}
public static void check(String content,String regex){
Pattern pattern=Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
while(matcher.find()){
System.out.println("全匹配子串为: "+matcher.group(0));
System.out.println("在全匹配子串中符合捕获分组的子串为: "+matcher.group(1));
//捕获分组有几个,你可以取的group(里面的值)就为几,超出就会报数组下标越界
System.out.println(matcher.group(2));
}
}
}


记录下次开始查找的位置


记录下次开始查找的位置


记录下次开始查找的位置


package Work;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test05 {
public static void main(String[] args) {
check("1924u1765nkf8976","(\\d\\d)\\d{2}");
}
public static void check(String content,String regex){
Pattern pattern=Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
while(matcher.find()){
System.out.println("全匹配子串为: "+matcher.group(0));
System.out.println("在全匹配子串中符合捕获分组的子串为: "+matcher.group(1));
}
}
}
