注意截取的位置为[0,4) ,包含 0 但是不包含索引为 4 的位置
- 如果再次指向find方法,仍然按照上面的分析去执行:
比如下一个匹配的子字符串是“1999”,首先,将该字符串的开始索引的值,以及结束索引加1的值记录到matcher属性的groups数组中(会先将上次存储在groups数组中的数值清空)
然后记录oldLast的值为 子串的结束索引+1,下次执行find方法时,就从该下标35开始匹配
groups[0]=31,groups[1]=35,oldLsat=35
文章插图
文章插图
然后执行matcher.group(0)方法,根据传入的参数group=0,计算groups[0 * 2] 和 groups[0 * 2 + 1] 的记录的位置,即[31,35),从content截取子字符串返回
在正则表达式中有括号(),表示分组,第一个括号()表示第一组,第二个括号()表示第二组....
实例代码:
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():
- 根据指定的规则,定位满足规则的子字符串(比如"1998")
?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调试:

文章插图
可以看到刚开始时,groups数组的所有值都是-1

文章插图
点击step over,可以看到groups数组的变化如下:

文章插图
//源码: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();}
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Java函数式编程:一、函数式接口,lambda表达式和方法引用
- .net lambda表达式合并
- SpringBoot框架SpEL表达式注入漏洞复现与原理分析
- C++ 使用栈求解中缀、后缀表达式的值
- 【Java8新特性】- Lambda表达式
- 二 Python常用的正则表达式
- spring cron表达式源码分析
- excel中如何使用countif的表达式进行统计?你知道吗?
- 名不正则言不顺言不顺则事不成是什么意思 名不正则言不顺言不顺则事不成的意思
- 氯酸钾制取氧气的文字表达式