“正则表达式 底层实现”的版本间的差异
跳到导航
跳到搜索
Jihongchang(讨论 | 贡献) |
Jihongchang(讨论 | 贡献) |
||
第54行: | 第54行: | ||
=== matcher.find() 完成的任务 === | === matcher.find() 完成的任务 === | ||
− | + | <syntaxhighlight lang="java"> | |
− | + | /** | |
+ | * matcher.find() 完成的任务 | ||
+ | * 1、根据指定的规则,定位满足规则的子字符串(比如:1998) | ||
+ | * 2、找到后,将子字符串的开始下标记录到 matcher 对象的属性 int[] groups; | ||
+ | * groups[0]=0,把该子字符串的结束下标+1的值记录到 group[1] = 4 | ||
+ | * 3、同时记录 oldLast 的值为子字符串的下标+1的值即4,即下次执行matcher.find()时,就从4开始匹配 | ||
+ | * | ||
+ | * matcher.group(0) 分析 | ||
+ | * | ||
+ | * 源码: | ||
+ | * 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(); | ||
+ | * } | ||
+ | * 1、根据 groups[0] = 0 和 groups[1] = 4 的记录的位置,从 content 开始截取子字符串返回 | ||
+ | * 就是[0,4) 包含0 但是不包含下标为4的位置 | ||
+ | * | ||
+ | * 如果再次指向 find 方法,仍然按上面分析来执行 | ||
+ | */ | ||
+ | while (matcher.find()) { | ||
+ | System.out.println("找到:" + matcher.group(0)); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
断点调试,观察、验证整个过程 | 断点调试,观察、验证整个过程 |
2022年11月15日 (二) 05:14的版本
https://www.bilibili.com/video/BV1Eq4y1E79W/?p=3
找出所有四个数字连在一起的子串
import java.util.regex.Matcher;
import java.util.regex.Pattern;
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平台的微型版)," +
"应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard Edition,Java 2平台的标准版),应用于桌面环境;" +
"J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应用3443于基于Java的应用服务器。" +
"Java 2平台的发布,是Java发展过程中最重要的一个里程碑,标志着Java的应用开始普及9889";
/**
* 目标:匹配所有四位的数字
* 说明
* 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));
}
}
}
找到:1998
找到:1999
找到:3443
找到:9889
https://www.bilibili.com/video/BV1Eq4y1E79W/?p=4
matcher.find() 完成的任务
/**
* matcher.find() 完成的任务
* 1、根据指定的规则,定位满足规则的子字符串(比如:1998)
* 2、找到后,将子字符串的开始下标记录到 matcher 对象的属性 int[] groups;
* groups[0]=0,把该子字符串的结束下标+1的值记录到 group[1] = 4
* 3、同时记录 oldLast 的值为子字符串的下标+1的值即4,即下次执行matcher.find()时,就从4开始匹配
*
* matcher.group(0) 分析
*
* 源码:
* 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();
* }
* 1、根据 groups[0] = 0 和 groups[1] = 4 的记录的位置,从 content 开始截取子字符串返回
* 就是[0,4) 包含0 但是不包含下标为4的位置
*
* 如果再次指向 find 方法,仍然按上面分析来执行
*/
while (matcher.find()) {
System.out.println("找到:" + matcher.group(0));
}
断点调试,观察、验证整个过程