Java的Regex --正則表達式


一、概述

    正則表達式通常被用來對字符串提供范圍性的校驗替換那些符合某個模式(規則)的文本。

    正則表達式所對應的類Pattern,所有的正則表達式都是在這個類下創建的。Pattern類用於創建一個正則表達式,也可以說創建一個匹配模式,它的構造方法是私有的,不可以直接創建,但可以通過Pattern.complie(String regex)簡單工廠方法創建一個正則表達式。

   Pattern類只能做一些簡單的匹配操作,要想得到更強更便捷的正則匹配操作,那就需要將Pattern與Matcher一起合作。Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持。

 完成使用方法如下:

         String str = "abc";
        //指定校驗格式
         Pattern p = Pattern.compile("abc");
         //將當前的規則和判斷字符串進行匹配
         Matcher m = p.matcher(str);
         //進行判斷
         boolean b = m.matches();
         System.out.println(b);

二、正則表達式常用符號介紹

  1、[ ] 表示匹配括號中的任意一個字符。比如:

      [a - z ]:表示匹配任意一個小寫字母。

  2、^字符:如果用在[ ]內表示非;如果^放在了整個表達式的開頭,表示強制以當前字符開頭。比如:

    [^a-z]:表示除了小寫字母以外的字符;^[a-z]則表示以小寫字母開頭。

  3、預定義符號:

  • .:表示任意字符;
  • \w:表示單詞字符 [a-zA-Z_0-9] 
  • \d:表示數字[0-9];
  • \s:表示空白字符:[ \t\n\x0B\f\r]
  • \D:表示非數字: [^0-9]
  • \W:表示非單詞字符:[^\w]
  • \S:表示非空白字符:[^\s]

    示例如下:

public static void main(String[] args) {
        String str = "\\\\";
        //1. 字符串是由3個字符組成:第一個字符只能從a/b/c,第二個字符只能由r/s/t
        // 第三個字符是數字
        // [xyz] - 表示可以是x/y/z中的任何一個
        // [a-b] - 按照碼表從a開始一直找到b
        //System.out.println(str.matches("[abc][rst][0-9]"));

        // 1.判斷一個字符串是否是由一個小寫字母組成
        // System.out.println(str.matches("[a-z]"));
        
        // 2. [^abc]表示除了a/b/c
        // System.out.println(str.matches("[^a-zA-Z]"));
        
        //3. 字符串由三個組成,第一個是字母,第二個是數字,
        //“.”表示任意一個字符
        //System.out.println(str.matches("[a-zA-Z][0-9]."));
        
        //4.判斷字符串是否只有一個字符
        //System.out.println(str.matches("."));
        
        //匹配.
        //\\. 經過java編譯就變成了\.,正則再轉義成. 表示.
        //System.out.println(str.matches("\\."));
        
        //\\\\java編譯\\;\\正則編譯后\
        // \\\\ -> \\ -> \ 
        //System.out.println(str.matches("\\\\"));
        System.out.println(str.matches("\\w"));
        System.out.println(str);
    }

 

   4、數量詞:

  • +:表示1次到多次 {1,};
  • *:表示0次多到次 {0,};  
  • ?:表示0次到一次 {0,1};
  • {n}:表示有且只有n次;
  • {n,}:表示n次及其以上;
  • {n,m}表示n-m次之間。

     示例如下:

    

public static void main(String[] args) {
        String str = "dasfd";
        //1. {5}恰好由n次
        System.out.println(str.matches("[a-zA-Z]{5}"));        
        //2. 至少由5個字母組成的字符串
        //System.out.println(str.matches("[a-zA-Z]{4}[a-zA-Z]+"));        
        System.out.println(str.matches("[a-zA-Z]{5,}"));
        
        //3.由6-12個字符組成
        System.out.println(str.matches(".{6,12}"));
    }

二、捕獲組

      捕獲組的特征:

      1、用()括起來的單元稱之為捕獲組;

      2、在正則表達式中,會對捕獲組進行自動編號,編號從1開始。這與大多數的編號從0開始不同。

      3、\n表示引用編號為n的捕獲組;

      4、捕獲組的編號從(左括號的出現位置開始依次計數。

     捕獲組往往用於疊字的判斷,示例如下:

        //{2,} -- 至少兩個字符  
        //(.)\\1+ 表示疊字
        String str1 = "娃哈哈";
        System.out.println(str1.matches(".*(.)\\1+.*"));
        //AABB 高高興興
        
        String str2 = "高高興興";
        System.out.println(str2.matches(".*(.)\\1(.)\\2.*"));
        //abab 休息休息 (..)任意兩個字符
        String str3 = "休息休息";
        System.out.println(str3.matches("(..)\\1"));

 三、正則表達式和String結合后的使用

      使用Pattern和Matcher的方式匹配太過繁瑣,我們往往使用字符串直接匹配的方法進行判斷。

     1、字符替換

        將String字符串中的字符進行替換,返回一個新的字符,原字符串不變。例如:

       String str = "asfsafasf12sad17--";
        //將字符串替換為--
        System.out.println(str.replaceAll("\\d", "-"));
        //將字符串中的所有的數字去掉;參數:正則表達式
        System.out.println(str.replaceAll("\\d", ""));
        //所有非數字替換掉
        System.out.println(str.replaceAll("\\D", ""));
        
        String sub = str.replaceAll("\\D", "");

       2、對字符串進行切割

       以某字符或數字作為切割符將字符串進行切割成多個子串,返回一個子串數組。例如:

        //切割
        String str = "40asfas40as1fasdcer4";
        //以數字為切割符將字符串切割成多個子串
        //作為切割符的字符會被整個切掉
        //如果切割符在字符串的尾部,會被直接切掉
        String[] arr = str.split("\\d");
        System.out.println(arr.length);
        for(String s : arr) {
            System.out.println(s);
        }

    3、使用$引用上一個捕獲組,對字符串進行去重和顛倒

       將字符串中的多個連續的字符去掉,或者將單詞進行顛倒。比如:

        String str = "Cat Dog";
        
        //將cat和dog的位置進行顛倒
        //在替換過程中,\n的形式不起作用
        //在替換過程中,如果想要引用上一個捕獲組,那么需要使用$n的形式
        System.out.println(str.replaceAll("(Cat)(.*)(Dog)", "$3$2$1"));
        String str1 = "我我我我愛愛學學學學習習";
        System.out.println(str1.replaceAll("(.)\\1+", "$1"));


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM