正则表达式的底层实现

底层源码

package com.ftn.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

//分析java的正则表达式的底层实现
public class RegTheory {
    public static void main(String[] args) {
        String content = "2005年6月,在Java One大会上,Sun公司发布了Java SE 6。" +
                "此时,Java的各种版本已经更名,已取消其中的数字2,如J2EE更名为JavaEE," +
                "J2SE更名为JavaSE,J2ME更名为JavaME。 [12] \n" +
                "2006年11月13日,Java技术的发明者Sun公司宣布,将Java技术作为免费软件对外发布。" +
                "Sun公司正式发布的有关Java平台标准版的第一批源代码,以及Java迷你版的可执行源代码。" +
                "从2007年3月起,全世界所有的开发人员均可对Java源代码进行修改 [13]  。\n" +
                "2009年,甲骨文公司宣布收购Sun [14]  。2010年,Java编程语言的共同创始人之一" +
                "姆斯·高斯林从Oracle公司辞职。2011年,甲骨文公司举行了全球性的活动,以庆祝Java7的推出," +
                "随后Java7正式发布。2014年,甲骨文公司发布了Java8正式版 [15]  。";

        //目标:匹配所有四个数字
        String regStr = "(\\d\\d)(\\d\\d)";
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        /**
         * matcher.find 完成的任务
         * 分组:(\d\d)(\d\d),正则表达式中有()表示分组,第一个()代表第一组,第二个()代表第二组
         * 1. 根据指定的规则,定位满足规则的子字符串(如2006)
         * 2. 找到后,将子字符串的开始的索引记录到 matcher对象的属性 int[] groups
         *    groups[0]=0,把该子字符串的结束的索引 +1 的值记录到 groups[1]=4
         *    如果有分组,则第一组匹配到的字符串索引将会存储到 group[2]=0,group[3]=2
         *    第二组匹配到的字符串索引将会存储到 group[4]=2,group[5]=4
         * 3.同时记录 oldLast的值为子字符串的结束的索引 +1 的值即 4,下次执行 find时,就从 4 开始匹配
         */
        while (matcher.find()){
            /**
             * //matcher.group 源码分析
             *             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
             */
            //1.如果正则表达式有分组,取出匹配的字符串的规则如下
            //2.group(0):表示匹配到的整体的字符串
            //3.group(1):表示匹配到的第一组的字符串
            //4.group(2):表示匹配到的第二组的字符串
            System.out.println(matcher.group(0));
            System.out.println(matcher.group(1));
            System.out.println(matcher.group(2));
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值