实例分析:给出一段字符串文本 , 请找出所有四个数字连在一起的子串===>分析底层实现
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));}}}
文章插图
5.3.1match.find()
- match.find()完成的任务:
- 根据指定的规则,定位满足规则的子字符串(比如1998)
- 找到后,将"1998"子字符串开始的索引记录到 matcher对象的属性 int[] groups数组中groups[0]=0 ;
文章插图
- 同时记录oldLast的值为 子串的结束索引+1 即4,这样做的原因是:下次执行find方法时,就从该下标4开始匹配
文章插图
//源码: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=0 , 计算groups[0 * 2]=0 和 groups[0 * 2 + 1]=4 的记录的位置,从content截取子字符串返回注意截取的位置为[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));}}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Java函数式编程:一、函数式接口,lambda表达式和方法引用
- .net lambda表达式合并
- SpringBoot框架SpEL表达式注入漏洞复现与原理分析
- C++ 使用栈求解中缀、后缀表达式的值
- 【Java8新特性】- Lambda表达式
- 二 Python常用的正则表达式
- spring cron表达式源码分析
- 怎么算预产期
- 名不正言不顺是哪家的思想? 名不正言不顺是哪家的思想