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

    推薦閱讀