Java高级Day54-正则表达式底层实现

140.正则表达式

正则表达式底层实现

**介绍:**一个正则表达式,就是用某种模式去匹配字符串的一个公式

复制代码
public class TestJava {
    public static void main(String[] args) {
        String content = "11943wd2342drwf4235";
​
        //目标:匹配所有四个数组
        //1、\\d表示一个任意的数字
        String regStr = "\\d\\d\\d\\d";
        String regStr2 = "(\\d\\d)(\\d\\d)";
        //2.创建模式对象
        Pattern pattern = Pattern.compile(regStr);
        //3.创建匹配器
        //说明:创建匹配器matcher,按照正则表达式的规则去匹配 content字符串
        Matcher matcher = pattern.matcher(content);
​
        //4.开始匹配
        /**
         *
         * matcher.find() 完成的任务 (考虑分组)
         * 什么是分组,比如(\d\d)(\d\d),小括号就是分组
         *
         * 1.根据指定的规则,定位满足条件的子字符串(比如1998)
         * 2.找到后,将子字符串的开始索引记录到 matcher对象的属性 int[] groups
         *   2.1 groups[0] = 0 ,把该字符串的结束的索引+1的值记录到 groups[1] = 4
         *   2.2 记录1组()匹配到的字符串 groups[2] = 0 groups[3] = 2
         *   2.3 记录2组()匹配到的字符串 groups[4] = 2 groups[5] = 4
         * 3.同时记录oldLast 的值为 子字符串的结束的索引+1的值 即4,即下次执行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)
         */
        while (matcher.find()) {
            //小结
            //1.如果正则表达式有() 即分组
            //2.取出匹配的字符串规则如下
            //3.group(0) 表示匹配到的字符串
            //4.group(1) 表示匹配到的字符串的第一组字串
            //4.group(2) 表示匹配到的字符串的第二组字串
            System.out.println("找到:" + matcher.group(0));
            System.out.println("第1组()匹配到的值=" + matcher.group(1));
            System.out.println("第2组()匹配到的值=" + matcher.group(2));
        }
    }
}
相关推荐
a180079310807 分钟前
软件工程面试题(二十二)
java·面试·软件工程
RainbowSea10 分钟前
4. RabbitMQ 发布确认的配置详细说明
java·消息队列·rabbitmq
车载小杜19 分钟前
基于指针的线程池
开发语言·c++
robin_suli22 分钟前
Spring事务的传播机制
android·java·spring
青云交23 分钟前
Java 大视界 -- Java 大数据在智能电网电力市场交易数据分析与策略制定中的关键作用(162)
java·大数据·数据分析·交易策略·智能电网·java 大数据·电力市场交易
沐知全栈开发25 分钟前
Servlet 点击计数器
开发语言
m0Java门徒29 分钟前
Java 递归全解析:从原理到优化的实战指南
java·开发语言
云徒川39 分钟前
【设计模式】原型模式
java·设计模式·原型模式
张张张3121 小时前
4.2学习总结 Java:list系列集合
java·学习
KATA~1 小时前
解决MyBatis-Plus枚举映射错误:No enum constant问题
java·数据库·mybatis