正則表達式

1 正則表達式的概述

//匹配目標:匹配所有四個數字
        String regStr = "(\\d\\d)(\\d\\d)";
        //2. 創(chuàng)建模式對象[即正則表達式對象]
        Pattern pattern = Pattern.compile(regStr);
        //3. 創(chuàng)建匹配器
        //說明:創(chuàng)建匹配器matcher, 按照 正則表達式的規(guī)則 去匹配 content字符串
        Matcher matcher = pattern.matcher(content);

//一旦匹配成功了 find()方法就會返回true

        /* * matcher.find() 完成的任務 (考慮分組)
         * 什么是分組坟冲,比如  這樣的規(guī)則"(\d\d)(\d\d)" ,正則表達式中有() 表示分組,第1個()表示第1組,第2個()表示第2組...
         * 1. 根據指定的規(guī)則 ,定位滿足規(guī)則的子字符串(比如(19)(98))
         * 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
         *    2.4.如果有更多的分組.....
*/
        while (matcher.find()) {
            //小結
            //1. 如果正則表達式有() 即分組
            //2. 取出匹配的字符串規(guī)則如下
            //3. group(0) 表示匹配到的子字符串
            //4. group(1) 表示匹配到的子字符串的第一組字串
            //5. group(2) 表示匹配到的子字符串的第2組字串
            //6. ... 但是分組的數不能越界.
            System.out.println("找到: " + matcher.group(0));
            System.out.println("第1組()匹配到的值=" + matcher.group(1));
            System.out.println("第2組()匹配到的值=" + matcher.group(2));

        }

2 轉義符
對于特殊字符串 需要用轉義符來處理

    public static void main(String[] args) {
        String content = "abc$(a.bc(123( )";
        //匹配"(" => \\(
        //匹配"." => \\.
        //String regStr = "\\(";
        String regStr = "\\.";
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);

        while (matcher.find()) {
            System.out.println("找到 " + matcher.group(0));
        }
    }

3 基本語法

image.png

image.png
public static void main(String[] args) {

        String content = "a11c8abc _ABCy @";
        //String regStr = "[a-z]";//匹配 a-z之間任意一個字符
        //String regStr = "[A-Z]";//匹配 A-Z之間任意一個字符
        //String regStr = "abc";//匹配 abc 字符串[默認區(qū)分大小寫]
        //String regStr = "(?i)abc";//匹配 abc 字符串[不區(qū)分大小寫]
        //String regStr = "[0-9]";//匹配 0-9 之間任意一個字符
        //String regStr = "[^a-z]";//匹配 不在 a-z之間任意一個字符
        //String regStr = "[^0-9]";//匹配 不在 0-9之間任意一個字符
        //String regStr = "[abcd]";//匹配 在 abcd中任意一個字符
        //String regStr = "\\D";//匹配 不在 0-9的任意一個字符
//        String regStr = "\\w";//匹配 大小寫英文字母, 數字碳竟,下劃線
        //String regStr = "\\W";//匹配 等價于 [^a-zA-Z0-9_]
        //\\s 匹配任何空白字符(空格,制表符等)
        //String regStr = "\\s";
        //\\S 匹配任何非空白字符 ,和\\s剛好相反
        //String regStr = "\\S";
        //.  匹配出 \n 之外的所有字符,如果要匹配.本身則需要使用 \\.
        String regStr = ".";

        //說明
        //1. 當創(chuàng)建Pattern對象時种远,指定 Pattern.CASE_INSENSITIVE, 表示匹配是不區(qū)分字母大小寫.
        Pattern pattern = Pattern.compile(regStr/*, Pattern.CASE_INSENSITIVE*/);
        Matcher matcher = pattern.matcher(content);


        while (matcher.find()) {
            System.out.println("找到 " + matcher.group(0));
        }
    }

4 選擇匹配符
選擇匹配符就是或的意思

    public static void main(String[] args) {

        String content = "hanshunping 韓 寒冷";
        String regStr = "han|韓|寒";

        Pattern pattern = Pattern.compile(regStr/*, Pattern.CASE_INSENSITIVE*/);
        Matcher matcher = pattern.matcher(content);


        while (matcher.find()) {
            System.out.println("找到 " + matcher.group(0));
        }
    }

5 限定符
用于指定其前面的字符和組合項連續(xù)出現多少次

image.png

image.png
public static void main(String[] args) {
        String content = "a211111aaaaaahello";

        //a{3},1{4},\\d{2}
        //String regStr = "a{3}";// 表示匹配 aaa
        //String regStr = "1{4}";// 表示匹配 1111
        //String regStr = "\\d{2}";// 表示匹配 兩位的任意數字字符

        //a{3,4},1{4,5},\\d{2,5}

        //細節(jié):java匹配默認貪婪匹配款筑,即盡可能匹配多的
        //String regStr = "a{3,4}"; //表示匹配 aaa 或者 aaaa
        String regStr = "1{4,5}"; //表示匹配 1111 或者 11111 腋么,遵守貪婪匹配咕娄,意思是 如果字符串是"11111" 那么就會匹配出"11111",而不是"1111"
        //String regStr = "\\d{2,5}"; //匹配2位數或者3,4,5


        //1+
        //String regStr = "1+"; //匹配一個1或者多個1
        //String regStr = "\\d+"; //匹配一個數字或者多個數字

        //1*
        //String regStr = "1*"; //匹配0個1或者多個1

        //?的使用, 遵守貪婪匹配 ,意思就是如果字符串是"a1",那么就會匹配出"a1"而不是"a"
//        String regStr = "a1?"; //匹配 a 或者 a1


        //限定符 限定的對象是前面一個單元 党晋,如果想限定前面一個整體 那么需要將前面的整體使用"()"括起來谭胚,比如:
        //m+abc* :以至少一個m開頭徐块,后接ab未玻,然后后接至少一個"c"字符串,比如 mab胡控,mmab,mabc,mmabc 都可以
        //m+(abc)* :以至少一個m開頭扳剿,后接至少一個"abc"字符串,比如 m昼激,mm,mabc,mmabc 都可以
        Pattern pattern = Pattern.compile(regStr/*, Pattern.CASE_INSENSITIVE*/);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) {
            System.out.println("找到 " + matcher.group(0));
        }
    }

6 定位符

定位符, 規(guī)定要匹配的字符串出現的位置庇绽,比如在字符串的開始還是在結束的位置


image.png
    public static void main(String[] args) {

        String content = "hanshunping sphan nnhan";
        //String content = "123-abc";
        //以至少1個數字開頭,后接任意個小寫字母的字符串
        //String regStr = "^[0-9]+[a-z]*";
        //以至少1個數字開頭, 必須以至少一個小寫字母結束
        //String regStr = "^[0-9]+\\-[a-z]+$";

        //表示匹配邊界的han[這里的邊界是指:被匹配的字符串最后,
        // 也可以是空格的子字符串的后面]
        //String regStr = "han\\b";

        //和\\b的含義剛剛相反
        String regStr = "han\\B";

        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);

        while (matcher.find()) {
            System.out.println("找到=" + matcher.group(0));
        }

    }

7 分組

image.png
image.png
    public static void main(String[] args) {

        String content = "hanshunping s7789 nn1189han";

        //下面就是非命名分組
        //說明
        // 1. matcher.group(0) 得到匹配到的字符串
        // 2. matcher.group(1) 得到匹配到的字符串的第1個分組內容
        // 3. matcher.group(2) 得到匹配到的字符串的第2個分組內容

        //String regStr = "(\\d\\d)(\\d\\d)";//匹配4個數字的字符串

        //命名分組: 即可以給分組取名
        String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)";//匹配4個數字的字符串

        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);

        while (matcher.find()) {
            System.out.println("找到=" + matcher.group(0));
            System.out.println("第1個分組內容=" + matcher.group(1));
            System.out.println("第1個分組內容[通過組名]=" + matcher.group("g1"));
            System.out.println("第2個分組內容=" + matcher.group(2));
            System.out.println("第2個分組內容[通過組名]=" + matcher.group("g2"));

        }
    }
    public static void main(String[] args) {

        String content = "hello韓順平教育 jack韓順平老師 韓順平同學hello韓順平學生";

//        找到 韓順平教育 橙困、韓順平老師瞧掺、韓順平同學 子字符串
        //String regStr = "韓順平教育|韓順平老師|韓順平同學";
        //上面的寫法可以等價非捕獲分組, 注意:不能 matcher.group(1)
        //String regStr = "韓順平(?:教育|老師|同學)";

        //找到 韓順平 這個關鍵字,但是要求只是查找韓順平教育和 韓順平老師 中包含有的韓順平
        //下面也是非捕獲分組,不能使用 matcher.group(1)
        //String regStr = "韓順平(?=教育|老師)";

        //找到 韓順平 這個關鍵字,但是要求只是查找 不是 (韓順平教育 和 韓順平老師) 中包含有的韓順平
        //下面也是非捕獲分組凡傅,不能使用 matcher.group(1)
        String regStr = "韓順平(?!教育|老師)";

        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) {
            System.out.println("找到: " + matcher.group(0));
        }
    }

8 非貪婪匹配

    public static void main(String[] args) {
        String content = "hello111111 ok";
        //String regStr = "\\d+"; //默認是貪婪匹配
       // String regStr = "\\d+?"; //非貪婪匹配
        String regStr = "\\d+?"; //非貪婪匹配

        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) {
            System.out.println("找到: " + matcher.group(0));
        }
    }

9 整體匹配

        //整體匹配辟狈,返回一個boolean值,表示content整體是否匹配regStr的格式
        Pattern.matches(regStr, content)
    public static void main(String[] args) {
        String content = "hello abc hello, ";
        //String regStr = "hello";
        String regStr = "hello.*";

        boolean matches = Pattern.matches(regStr, content);
        System.out.println("整體匹配= " + matches);
    }

10 String類使用正則表達式
String類也可以使用正則表達式來方便的實現功能

    public static void main(String[] args) {
        String content = "2000年5月,JDK1.3哼转、JDK1.4和J2SE1.3相繼發(fā)布明未,幾周后其" +
                "獲得了Apple公司Mac OS X的工業(yè)標準的支持。2001年9月24日壹蔓,J2EE1.3發(fā)" +
                "布趟妥。" +
                "2002年2月26日,J2SE1.4發(fā)布佣蓉。自此Java的計算能力有了大幅提升";

        //使用正則表達式方式披摄,將 JDK1.3 和 JDK1.4 替換成JDK
        content = content.replaceAll("JDK1\\.3|JDK1\\.4", "JDK");
        System.out.println(content);

        //要求 驗證一個 手機號, 要求必須是以138 139 開頭的
        content = "13888889999";
        if (content.matches("1(38|39)\\d{8}")) {//String的 ()是整體匹配
            System.out.println("驗證成功");
        } else {
            System.out.println("驗證失敗");
        }


        //要求按照 # 或者 - 或者 ~ 或者 數字 來分割
        System.out.println("===================");
        content = "hello#abc-jack12smith~北京";
        String[] split = content.split("#|-|~|\\d+");
        for (String s : split) {
            System.out.println(s);
        }
    }

11 自己的例子

  • 1 匹配時間格式:"HH:mm:ss"
    public static void main(String[] args) {
//        匹配時間格式:"HH:mm:ss"

        String content = "11:01:11";
        //嚴格按照HH:mm:ss格式匹配勇凭,
//        String regStr = "^(0[0-9]|1[0-9]|2[0-3]):[0-5]\\d:[0-5]\\d$";
        //不嚴格按照HH:mm:ss格式匹配行疏,遇到個位數 可省略0,如"1:1:1"
        String regStr = "^([0-1]?[0-9]|[2][0-3]):([0-5]?[0-9]):([0-5]?[0-9])$";

        boolean matches = Pattern.matches(regStr, content);
        System.out.println("整體匹配= " + matches);

    }

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末套像,一起剝皮案震驚了整個濱河市酿联,隨后出現的幾起案子,更是在濱河造成了極大的恐慌夺巩,老刑警劉巖贞让,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異柳譬,居然都是意外死亡喳张,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門美澳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來销部,“玉大人,你說我怎么就攤上這事制跟【俗” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵雨膨,是天一觀的道長擂涛。 經常有香客問我,道長聊记,這世上最難降的妖魔是什么撒妈? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮排监,結果婚禮上狰右,老公的妹妹穿的比我還像新娘。我一直安慰自己舆床,他們只是感情好棋蚌,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般附鸽。 火紅的嫁衣襯著肌膚如雪脱拼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天坷备,我揣著相機與錄音熄浓,去河邊找鬼。 笑死省撑,一個胖子當著我的面吹牛赌蔑,可吹牛的內容都是我干的。 我是一名探鬼主播竟秫,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼娃惯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肥败?” 一聲冷哼從身側響起趾浅,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎馒稍,沒想到半個月后皿哨,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡纽谒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年证膨,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鼓黔。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡央勒,死狀恐怖,靈堂內的尸體忽然破棺而出澳化,到底是詐尸還是另有隱情崔步,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布肆捕,位于F島的核電站刷晋,受9級特大地震影響盖高,放射性物質發(fā)生泄漏慎陵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一喻奥、第九天 我趴在偏房一處隱蔽的房頂上張望席纽。 院中可真熱鬧,春花似錦撞蚕、人聲如沸润梯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纺铭。三九已至寇钉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舶赔,已是汗流浹背扫倡。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留竟纳,地道東北人撵溃。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像锥累,于是被迫代替她去往敵國和親缘挑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內容