day50-正则表达式01( 三 )


注意截取的位置为[0,4) ,包含 0 但是不包含索引为 4 的位置
  • 如果再次指向find方法,仍然按照上面的分析去执行:
    比如下一个匹配的子字符串是“1999”,首先,将该字符串的开始索引的值,以及结束索引加1的值记录到matcher属性的groups数组中(会先将上次存储在groups数组中的数值清空)
    然后记录oldLast的值为 子串的结束索引+1,下次执行find方法时,就从该下标35开始匹配
    groups[0]=31,groups[1]=35,oldLsat=35
    day50-正则表达式01

    文章插图
    day50-正则表达式01

    文章插图
    然后执行matcher.group(0)方法,根据传入的参数group=0,计算groups[0 * 2] 和 groups[0 * 2 + 1] 的记录的位置,即[31,35),从content截取子字符串返回
5.3.3分组什么是分组?
在正则表达式中有括号(),表示分组,第一个括号()表示第一组,第二个括号()表示第二组....
实例代码:
package li.regexp;import java.util.regex.Matcher;import java.util.regex.Pattern;//分析java的正则表达式的底层实现**public class RegTheory {public static void main(String[] args) {String content="1998年12月8日,第二代Java平台的企业版J2EE发布 。1999年6月,Sun公司发布了" +"第二代Java平台(简称为Java2)的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型" +"版),应用于移动、无线及9889有限资源的环境;J2SE(Java 2 Standard Edition,Java 2平台的" +"标准版),应用于桌面环境;J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应" +"用于基于Java的应用服务器 。Java 2平台的发布,是Java发展过程中最重要的一个里程碑,标志着J" +"ava的应用开始普及 。3443";//请找出所有四个数字连在一起的子串//说明:// 1.\\d表示一个任意的数字String regStr="(\\d\\d)(\\d\\d)";//2.创建一个模式对象Pattern pattern = Pattern.compile(regStr);//3.创建匹配器//说明:创建匹配器matcher,按照前面写的 正则表达式的规则 去匹配 content字符串Matcher matcher = pattern.matcher(content);//4.开始匹配while (matcher.find()){System.out.println("匹配:"+matcher.group(0));System.out.println("第1组括号()匹配到的值="+matcher.group(1));System.out.println("第2组括号()匹配到的值="+matcher.group(2));}}}以上面的代码为例:
  • match.find():
  1. 根据指定的规则,定位满足规则的子字符串(比如"1998")
2.1找到后,将"1998"子字符串开始的索引记录到 matcher对象的属性 int[] groups数组中
?groups[0]=0 ;把该子串的结束索引+1的值记录到 groups[1] = 4
2.2 记录第一组括号()匹配到的字符串("19")的位置 : groups[2]=0 , groups[3]=2
2.3 记录第二组括号()匹配到的字符串("98")的位置 : groups[4]=2 , groups[5]=4
如果有更多的分组就以此类推
下标从0开始
验证:
在程序中打上断点,点击debug调试:
day50-正则表达式01

文章插图
可以看到刚开始时,groups数组的所有值都是-1
day50-正则表达式01

文章插图
点击step over,可以看到groups数组的变化如下:
day50-正则表达式01

文章插图
//源码: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();}

经验总结扩展阅读