day50-正则表达式01( 二 )


  • 正则表达式不是java独有的,实际上很多编程语言都支持正则表达式进行字符串操作,且它们的匹配规则大同小异 。
  • 5.3底层实现
    实例分析:
    给出一段字符串文本 , 请找出所有四个数字连在一起的子串===>分析底层实现
    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));}}}
    day50-正则表达式01

    文章插图
    5.3.1match.find()
    • match.find()完成的任务:
    1. 根据指定的规则,定位满足规则的子字符串(比如1998)
    2. 找到后,将"1998"子字符串开始的索引记录到 matcher对象的属性 int[] groups数组中groups[0]=0 ;
    ? 把该子串的结束索引+1的值记录到 groups[1] = 4
    day50-正则表达式01

    文章插图
    1. 同时记录oldLast的值为 子串的结束索引+1 即4,这样做的原因是:下次执行find方法时,就从该下标4开始匹配
      day50-正则表达式01

      文章插图
    5.3.2matcher.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();}根据传入的参数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
      day50-正则表达式01

      文章插图
      day50-正则表达式01

      文章插图
      然后执行matcher.group(0)方法 , 根据传入的参数group=0,计算groups[0 * 2] 和 groups[0 * 2 + 1] 的记录的位置,即[31,35) , 从content截取子字符串返回
    5.3.3分组什么是分组?
    在正则表达式中有括号(),表示分组,第一个括号()表示第一组,第二个括号()表示第二组....
    实例代码:
    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));}}}

    推荐阅读