正则表达式 底层实现

来自姬鸿昌的知识库
跳到导航 跳到搜索

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));
        }

断点调试,观察、验证整个过程