Java基礎(chǔ)進階 正則的詳解

1设捐、正則表達式

在開發(fā)中梗夸,通常很多數(shù)據(jù)都會使用String類存儲层玲。原因:操作字符串的功能比較多,比較方便。
在操作String類對象時辛块,會經(jīng)常遇到對字符串進行驗證的功能畔派,而按照我們之前學(xué)習(xí)的String類,我們使用String類中的諸多函數(shù)是可以完成對字符串校驗功能的润绵,但是代碼相對來說比較麻煩线椰,所以在Java中引入正則表達式的概念來解決上述問題,即簡化代碼尘盼。
正則表達式:專門用于操作字符串的技術(shù)憨愉,并且可以簡化代碼,用于對字符串的復(fù)雜操作卿捎。
正則表達式弊端:代碼可讀性比較差配紫。

1.1、案例引入

需求:驗證QQ號碼是否合法午阵。
分析:
1笨蚁、第一位不能是零;
2趟庄、QQ號碼在5到12之間(包含)括细;
3、QQ號碼都是由數(shù)字組成戚啥;

步驟:
1)定義一個RegexDemo類奋单,在這個類中定義一個主函數(shù)main和一個自定義函數(shù)method_1;
2)在main函數(shù)中調(diào)用自定義函數(shù)method_1;
3)在自定義函數(shù)method_1中定義一個字符串變量QQ,并賦值為12345猫十;
4)使用if-elseIf-else結(jié)構(gòu)對字符串QQ分別按照上述給定的三個條件進行判斷览濒;
5)使用String類中的charAt()函數(shù)獲取字符串QQ中的第一個字符和字符0進行比較,相等則告訴用戶不能以0開始拖云;
6)使用String類中的length()函數(shù)獲得字符串QQ的長度贷笛,判斷是否在5~12之間;
7)驗證字符串QQ中是否都是數(shù)字宙项,使用Long.parseLong(QQ)把一個字符串轉(zhuǎn)成 long 類型的數(shù)據(jù)乏苦,此函數(shù)容易發(fā)生異常,所以使用try-catch代碼塊對該代碼進行捕獲異常處理尤筐;

package xuexi.a_regex_demo;
/*
 * 需求:驗證QQ號碼是否合法汇荐。
 分析:
 1、第一位不能是零盆繁;
 2掀淘、QQ號碼在5到12之間(包含);
 3油昂、QQ號碼都是有數(shù)字組成革娄;
 */
public class RegexDemo {
    public static void main(String[] args) {
        method_1();
    }
    private static void method_1() {
        // 定義一個字符串變量
        String QQ = "12345676";
        /*
         * 使用判斷結(jié)構(gòu)判斷字符串是否合法
         */
        // 判斷字符串的第一位是否是0 QQ.charAt(0)表示通過charAt函數(shù)根據(jù)指定的下標(biāo)獲取下標(biāo)對應(yīng)的字符
        if (QQ.charAt(0) == '0') {
            // 說明字符串以0開始
            System.out.println("QQ號碼不能以0開始");
        } else if (QQ.length() < 5 || QQ.length() > 12) {
            // 說明qq的號碼的長度不在5~12之間
            System.out.println("QQ號碼的長度錯誤");
        } else {
            /*
             * 說明QQ的號碼一定不是以0開始倾贰,并且長度一定在5~12之間,接下來驗證是否為數(shù)字
             * 使用包裝類Long中的parseLong()函數(shù)判斷字符串中的字符是否為數(shù)字
             * 如果不為數(shù)字拦惋,這個函數(shù)會拋異常alt+shift+z寫try-catch代碼塊
             */
            try {
                long parseLong = Long.parseLong(QQ);// 將字符串轉(zhuǎn)換為long類型的數(shù)字
                System.out.println("QQ號碼是:" + QQ);
                System.out.println("QQ號碼是:" + parseLong);
            } catch (NumberFormatException e) {
                System.out.println("QQ號碼中有其他非數(shù)字的字符");
            }
        }
    }
}

說明:
1)使用包裝類Long中的parseLong()函數(shù)判斷字符串中的字符是否為數(shù)字躁染。如果不為數(shù)字,這個函數(shù)會拋異常架忌,既然要拋異常所以寫個try-catch代碼塊對異常進行處理;
2)對某塊代碼進行try-catch處理我衬,可以按alt+shift+z快捷鍵生成try-catch代碼塊叹放;
在開發(fā)中字符串是我們使用頻率最高的一類數(shù)據(jù),針對上述程序僅僅就是為了驗證一個字符串中的數(shù)據(jù)是否正確挠羔,用上述代碼能夠解決問題井仰,但是代碼很麻煩。在計算機語言中針對這類數(shù)據(jù)的驗證和其他操作給出了更加簡單的處理方案破加。
這個方案就是正則表達式俱恶。正則表達式它的存在就是用來簡化代碼的書寫,方便完成對字符串的操作范舀。

說明:
1合是、String類中提供一個matches()函數(shù),可以判斷字符串對象是否匹配正則表達式锭环。
1)如果匹配聪全,則返回true;
2)如果不匹配辅辩,則返回false难礼;
2、 [1-9]:表示字符串中第一位能夠出現(xiàn)1~9任何一個數(shù)字玫锋;
3蛾茉、 [0-9]{4,11}:表示字符串中從第2位開始后面的數(shù)字只能出現(xiàn)0~9之間的數(shù)字,并且最少出現(xiàn)4次撩鹿,最多出現(xiàn)11次谦炬;
4、 如果滿足上述條件則返回true节沦,否則返回false

將上述代碼進行優(yōu)化吧寺,結(jié)果如下:

package xuexi.a_regex_demo;
/*
 * 需求:驗證QQ號碼是否合法。
 分析:
 1散劫、第一位不能是零稚机;
 2、QQ號碼在5到12之間(包含)获搏;
 3赖条、QQ號碼都是有數(shù)字組成失乾;
 */
public class RegexDemo {
    public static void main(String[] args) {
        method_2();
    }
    // 使用正則表達式完成QQ號碼的驗證
    private static void method_2() {
        // 定義一個字符串變量
        String QQ = "12345";
        /*
         * String類中提供一個matches()函數(shù),可以判斷字符串對象是否匹配正則表達式
         * 如果匹配纬乍,則返回true
         * 如果不匹配碱茁,則返回false
         * [1-9]:表示字符串中第一位能夠出現(xiàn)1~9任何一個數(shù)字
         * [0-9]{4,11}:表示字符串中從第2位開始后面的數(shù)字只能出現(xiàn)0~9之間的數(shù)字,并且最少出現(xiàn)4次仿贬,最多出現(xiàn)11次
         * 如果滿足上述條件則返回true纽竣,否則返回false
         */
        boolean flag = QQ.matches("[1-9][0-9]{4,11}");
        System.out.println(flag);
    }
}

總結(jié):正則表達式其實就是通過一些符號簡化了代碼的書寫,其實底層對應(yīng)的還是代碼茧泪,只不過是不用我們程序員來書寫代碼蜓氨,我們只需要書寫正則表達式即可完成相應(yīng)的功能。
正則表達式的弊端:符號越多队伟,閱讀性越差穴吹。
所以要想學(xué)習(xí)正則表達式就得先學(xué)習(xí)一些符號。

1.2嗜侮、正則表達式介紹

正則表達式:正確的規(guī)則組成的一個表達式港令。其實就是用來簡化字符串的操作。通過一些限定符號組成一種規(guī)則锈颗,來驗證字符串是否符合規(guī)則
它的功能主要是用來對字符串進行各種的操作(驗證顷霹、匹配、切割击吱、替換泼返,獲取等)。
結(jié)論:正則表達式只能使用在字符串上姨拥。

學(xué)習(xí)正則表達式:主要是學(xué)習(xí)正則表達式中的常用符號绅喉。
正則表達式:它是用我們所熟悉的 大括號、中括號 叫乌、小括號柴罐、字母 、數(shù)字憨奸、特殊符號等代替Java代碼對字符串進行操作革屠。

1.3、正則表達式常用符號介紹(掌握)

在api中有正則表達式的符號介紹:


1.png

我們使用正則表達式其中一個重要的功能就是驗證字符串中每個字符是否正確:
學(xué)習(xí)怎么寫一個正則表達式去匹配(驗證)字符串的每一位排宰。
正則表達式符號介紹:正則表達式一般也需要使用字符串進行展示:

1似芝、一般符號
x: 指的是普通字符,x代表的是未知數(shù)板甘,代表著任何一個普通字符党瓮,舉例x可以代表a,也可以代表b,同時也可以代表c等普通字符盐类。
舉例說明:"a[1-9][0-9]{4,11}"這里所寫的a就是普通字符x中的一種寞奸,這時x就代表a,那么也就是說此正則表達式的第一位只能是普通字符a;
\ : 表示反斜線 例:“\” 在正則中就是“\”
\t :制表符呛谜。相當(dāng)于tab鍵。

2枪萄、給出某個位置上可以出現(xiàn)的多個字符
[ ]表示范圍的意思隐岛。表示某一位上可以出現(xiàn)的字符數(shù)據(jù),如果正則中需要匹配的某個字符串中某一位上的字符是唯一的瓷翻,這時可以省略中括號聚凹。[]還有一個意思,在正則中還可以表示轉(zhuǎn)義齐帚。
[abc] 表示要么是a要么是b還可以是c(只能是其中任意一個)
例:”NBA” 正則:”N[ABC]A” 匹配正確:NBA NAA NCA
[^abc] 當(dāng)前要匹配的某個字符串中的某一位上不能是a或b 或c(除了a,b,c都可以)
[a-z] 表示26個小寫字母
[A-Z] 表示26個大寫字母
[a-zA-Z] 表示26個大小寫字母
[a-d[m-p]] 當(dāng)前要匹配的某個字符串中的某一位上 可以是a -d 或 m - p 的字符
[a-d&&[d-f]] 表示只能是d妒牙。必須在兩個范圍中都要符合账劲。(交集)
[a-d&&[^d-f]] 表示只能是a,b,c
[a-z&&[^xyz]] 表示只能是除去x,y,z后的所有小寫字母
[0-9] 表示0~9之間任意數(shù)字

3佳窑、提前定義好的一些符號纫溃,可以代替上述的[]書寫的范圍


2.png

·點 表示當(dāng)前需要匹配的字符串位置上可以是任意的字符。例:以a開始后面可以是任意字符 “a.”
\d 表示數(shù)字饥伊。[0-9] 例:“A[\d]C” 表示A和C之間可以任意的0~9之間的數(shù)字。

說明:為什么在上述正則表達式“A[\d]C”中書寫\d蔫饰,而不是直接書寫\d呢?
\d 代表著正則表達式中的一個符號琅豆,\和d放在一起代表0~9的十個數(shù)字。一旦將\d書寫在””雙引號中作為字符串篓吁,會出現(xiàn)一個問題茫因,\就會把這個d轉(zhuǎn)義了,一旦轉(zhuǎn)義就不表示\d是一起的了杖剪,那怎么解決這種問題呢冻押?
我們應(yīng)該在\d前面在加一個,如:\d,第一個 \ 表示將第二個 \ 轉(zhuǎn)義成普通的反斜線字符,而變成普通的反斜線之后和d組合就代表著正則中的數(shù)字盛嘿,所以我們需要這樣寫:”\d” 等同于”[0-9]”
\\ 反斜線字符
\D 表示非數(shù)字洛巢。[^0-9]
\w 表示[a-zA-Z_0-9]</tt>〈握祝可以是任意數(shù)字稿茉、任意大小寫字母、下劃線芥炭。
\W 表示[^a-zA-Z_0-9]表示和\w相反漓库。

4、邊界匹配


3.png

^ 表示行的開頭 例:“^h.” 表示只能是以h作為開頭
$ 表示行的結(jié)尾 例:”^h.o$” 表示只能以h作為開頭园蝠,以o作來結(jié)尾

5渺蒿、數(shù)量詞:表示當(dāng)前正則表達式中某個規(guī)則可以出現(xiàn)的次數(shù)。注意:數(shù)量詞前面必須有存在正則符號彪薛。

5.png

“A?” 表示當(dāng)前需要匹配字符串這個位置開始往后大寫字母A可以出現(xiàn)零次或一次蘸嘶;

舉例:”[0-9]?”表示在當(dāng)前的字符串位置上0~9之間的任何一個數(shù)只能出現(xiàn)零次或者一次良瞧;
“A*” 表示當(dāng)前需要匹配字符串這個位置開始往后大寫字母A可以出現(xiàn)零次或多次;

舉例:”[0-9]*”表示在當(dāng)前的字符串位置上0~9之間的任何一個數(shù)可以出現(xiàn)零次或者一次或者多次训唱;
“A+” 表示當(dāng)前需要匹配字符串這個位置開始往后大寫字母A可以出現(xiàn)一次或多次褥蚯;

舉例:”[0-9]+”表示在當(dāng)前的字符串位置上0~9之間的任何一個數(shù)可以出現(xiàn)一次或者多次;
“A{n}”----> “A{10}” 表示當(dāng)前需要匹配字符串這個位置開始往后大寫字母A必須出現(xiàn)10次况增;

舉例:”[0-9]{10}”表示在當(dāng)前的字符串位置上0~9之間的任何一個數(shù)可以出現(xiàn)10次赞庶;
“A{n,}----->”“A{10,}”表示當(dāng)前需要匹配字符串這個位置開始往后大寫字母A最少出現(xiàn)10次;

舉例:”[0-9]{10,}”表示在當(dāng)前的字符串位置上0~9之間的任何一個數(shù)最少出現(xiàn)10次澳骤;
“A{n,m}”---->“A{10,20}”表示當(dāng)前需要匹配字符串這個位置開始往后大寫字母A最少出現(xiàn)10次歧强,最多20次;

舉例:”[0-9]{10,20}”表示在當(dāng)前的字符串位置上0~9之間的任何一個數(shù)最少出現(xiàn)10次为肮,最多20次摊册;


5.png

1.4、正則的功能介紹(掌握)

正則表達式的主要功能:
它主要是用來對字符串進行操作:匹配(驗證)颊艳、切割茅特、替換、獲取棋枕。
正則表達式需要和String類中的某些函數(shù)結(jié)合使用白修。

1.4.1、匹配

6.png

根據(jù)指定的正則表達式匹配字符串重斑,匹配正確返回的是true兵睛,匹配錯誤,返回false窥浪。
需求:驗證手機號碼

分析:手機號碼的規(guī)則:
1)長度必須是11位祖很;
2)第一位只能是數(shù)字1;
3)第二位可以是3 4 5 7 8漾脂;
4)從第三位開始可以是0-9

步驟:
1)定義一個RegexDemo1類突琳,在這個類中定義一個主函數(shù)main;
2)在main函數(shù)中定義一個String類型的變量tel,并賦值為15066668888;
3)定義一個手機號碼的正則規(guī)則regex=”1[34578][0-9]{9}”;
4)使用字符串變量tel調(diào)用String類中的matches()函數(shù)符相,regex正則規(guī)則作為參數(shù)進行傳遞拆融,打印結(jié)果;

package xuexi.a_regex_demo;
/*
 * 需求:驗證手機號碼
 分析:手機號碼的規(guī)則:
 1)長度必須是11位啊终;
 2)第一位只能是數(shù)字1镜豹;
 3)第二位可以是3 4 5 7 8;
 4)從第三位開始可以是0-9
 */
public class RegexDemo1 {
    public static void main(String[] args) {
        // 定義一個字符串
        String tel = "15066668888";
        // 定義一個手機號的正則
        String regex = "1[34578][0-9]{9}";
        // 使用字符串對象tel調(diào)用String類中的matches函數(shù)蓝牲,判斷字符串是否匹配正則表達式
        System.out.println(tel.matches(regex));
    }
}

1.4.2趟脂、切割

7.png

需求:使用String類中的split函數(shù)根據(jù)正則表達式規(guī)則,以數(shù)字對已知的字符串進行切割例衍。
1)定義RegexDemo2 類昔期;
2)在這個類中定義一個字符串str已卸,并賦值為”sfajs12321dbfj234d23sjfk454sdjf565sdhd757hf”;
3)定義一個正則表達式規(guī)則:regex=”\d+”;
4)使用定義好的字符串str調(diào)用split()函數(shù)對正則表達式進行切割;
5)遍歷切割后的數(shù)組硼一;

package xuexi.a_regex_demo;
/*
 * 需求:使用String類中的split函數(shù)根據(jù)正則表達式規(guī)則累澡,以數(shù)字對已知的字符串進行切割。
 1)定義RegexDemo2 類般贼;
 2)在這個類中定義一個字符串str愧哟,并賦值為”sfljs12321dlfj234d23sjfk454sdjf565sdhd757hf”;
 3)定義一個正則表達式規(guī)則:regex=”\\d+”;
 4)使用定義好的字符串str調(diào)用split()函數(shù)對正則表達式進行切割;
 5)遍歷切割后的數(shù)組哼蛆;
 */
public class RegexDemo2 {
    public static void main(String[] args) {
        // 定義一個字符串
        String str = "sfajs12321dbfj234d23sjfk454sdjf565sdhd757hf";
        // 定義一個正則表達式蕊梧,以數(shù)字對上述字符串進行切割{"sfajs","dbfj","d","sjfk"}
        String regex = "\\d+";
        String[] strs = str.split(regex);
        // 遍歷數(shù)組
        for (int i = 0; i < strs.length; i++) {
            // 打印數(shù)組中的數(shù)據(jù)
            System.out.println(strs[i]);
        }
    }
}

需求:使用String類中的split函數(shù)根據(jù)正則表達式規(guī)則,以疊詞對已知的字符串進行切割腮介。
疊詞:就是重復(fù)出現(xiàn)的字符肥矢。
1)在RegexDemo2類中定義一個method_2函數(shù);
2)在method_2函數(shù)中定義一個字符串str叠洗,并賦值為
”sfljs#######lfj234#######k454sd#####sdhd######hf”;
3)定義一個正則表達式規(guī)則:regex=”#+”;
4)使用定義好的字符串str調(diào)用split()函數(shù)對正則表達式進行切割甘改;
5)遍歷切割后的數(shù)組;

public class RegexDemo2 {
    public static void main(String[] args) {
        method_2();
    }
    
    //以同一個疊詞 切割
    public static void method_2() {
        String str = "sfljs#######lfj234#######k454sd#####sdhd######hf";
        
        String regex = "#{2,}";
        String[] split = str.split(regex);
        
        for (int i = 0 ; i<split.length ; i++) {
            System.out.println(split[i]);
        }
        
    }

1.4.3惕味、正則中的組

需求:以疊詞對已知字符串”sfljs####lfj234TTTTTTTk454sdOOOOOOOsdhd11111111hf”進行切割楼誓。

分析:這個字符串不再像我們之前做過的字符串玉锌,他比較特殊名挥,我們之前的疊詞都是一樣的字符,而這個疊詞中的字符都不相同主守,如果按照我們之前去切割是不能夠?qū)崿F(xiàn)的禀倔,那么我們該如何去切割已知的字符串呢?
我們需要借助正則中的組來完成参淫。

正則中組的概念:
組:把已經(jīng)存在的一個正則規(guī)則使用小括號封裝起來救湖,當(dāng)在正則表達式中的其他位置上需要使用
已經(jīng)存在的正則規(guī)則的時候,這時沒有必要再書寫重復(fù)的規(guī)則涎才,而直接去引用被封裝好的正則規(guī)則鞋既。

例如:"([a-z_A-Z])bc[a-z_A-Z]"

上述正則表達式:在第一位和第四位上是相同的正則規(guī)則,同一正則表達式中不同位置上存在了相同規(guī)則的正則耍铜,在書寫上重復(fù)沒有必要邑闺。我們可以在正則表達式中的第一個位置上把[a-z_A-Z] 這個規(guī)則進行封裝到一個組中。然后在正則的第四位上需要使用和第一位上相同的規(guī)則即可棕兼。 這時可以在第四位上引用這個被封裝好的組陡舅。

在正則中一旦把某個規(guī)則使用小括號封裝成組之后,由于我們只能使用小括號進行組的封裝伴挚,而無法給組起名靶衍,這時會自動的給這些組進行編號灾炭,組的編號從1開始,一個小括號就是一組颅眶。

       如果在當(dāng)前分組的這個正則表達式中引用已經(jīng)存在的組蜈出,需要使用\\組的編號
           例如:"([a-z_A-Z])bc\\1"

需求:使用String類中的split函數(shù)根據(jù)正則表達式規(guī)則,以疊詞對已知的字符串進行切割帚呼。(練習(xí)正則表達式中的組的概念)
1)在RegexDemo2類中定義一個method_3函數(shù)掏缎;
2)在method_3函數(shù)中定義一個字符串str,并賦值為
”sfljs####lfj234TTTTTTTk454sdOOOOOOOsdhd11111111hf”;
3)定義一個正則表達式規(guī)則:regex=”(.)\1+”;
4)使用定義好的字符串str調(diào)用split()函數(shù)對正則表達式進行切割煤杀;
5)遍歷切割后的數(shù)組眷蜈;


8.png

需求:電子郵箱匹配的練習(xí);
分析:
1)電子郵箱的@符號是固定的沈自,前面是用戶名酌儒,后面是一般公司的域名信息;
2)用戶名可以是數(shù)字 字母 下劃線枯途;
3)公司域名可以是數(shù)字 字母忌怎;
步驟:
1)定義RegexDemo3類;
2)在這個類中定義一個字符串email酪夷,并賦值為”heixuanfeng@163.com”;
3)定義一個正則表達式規(guī)則:
regex=”[0-9a-zA-Z_]+@[0-9a-zA-Z]+(\.[a-zA-Z]+){1,3}”;
4)使用字符串對象email調(diào)用String類中的matches函數(shù)榴啸,regex作為正則表達式規(guī)則,并打印結(jié)果晚岭;

package xuexi.a_regex_demo;
public class RegexDemo3 {
    public static void main(String[] args) {
        //定義一個字符串
        String str="heixuanfeng@163.com.cn";
        //定義一個正則表達式來驗證郵箱
        //(\\.[a-zA-Z]+){1,3}表示.com.cn可以出現(xiàn)1到3次
        String regex="\\w+@[0-9a-zA-Z]+(\\.[a-zA-Z]+){1,3}";
        System.out.println(str.matches(regex));
    }
}

1.4.4鸥印、替換

9.png

案例1:替換的簡單應(yīng)用
需求:
1)定義一個RegexDemo4類,在這個類中定義一個main函數(shù)坦报;
2)在main函數(shù)中定義一個字符串str,并賦值為hello world库说;
3)使用str字符串對象調(diào)用String類中的replaceAll()函數(shù)將字符串中的l替換為i,并重新生成一個字符串,并打悠瘛潜的;

10.png

案例2:把字符串中的所有#號變?yōu)?號,最后變成一個-
需求:
1)在RegexDemo4類中定義一個method_2函數(shù);
2)在method_2函數(shù)中定義一個字符串str,并賦值為
“sdhf#jksdhf1232###j45k45dsh54######65f765j#######7kd”;
3)使用str字符串對象調(diào)用String類中的replaceAll()函數(shù)將字符串中所有的#替換為-,并重新生成一個字符串字管,并打訂病;

11.png

案例3:把字符串中的多個相同字符嘲叔,替換成一個字符
原字符串:“abc###nbaAAAAAAsh000000xuexi#####cbaXXXXXXcom”
替換后:” abc#nbaAsh0xuexi#cbaXcom
說明:
前面學(xué)習(xí)了在一個正則表達中使用前面已經(jīng)封裝的正則規(guī)則亡呵,使用\組號引用
如果需要在其他地方引用正則中的組,這里需要使用 $組號借跪。
需求:
1)在RegexDemo4類中定義一個method_3函數(shù)政己;
2)在method_3函數(shù)中定義一個字符串str,并賦值為
“abc###nbaAAAAAAsh000000xuexi#####cbaXXXXXXcom”;
3)使用str字符串對象調(diào)用String類中的replaceAll()函數(shù)將字符串中所有的多個相同的字符替換成一個字符,并重新生成一個字符串,并打印歇由;

12.png

案例4:隱藏手機號碼中間4位 150****8888

需求:
1)在RegexDemo4類中定義一個method_4函數(shù)卵牍;

  1. 在method_4函數(shù)中定義一個字符串str,并賦值為”15066668888”;
    3)把正則表達式分為三組,第二組使用****替換沦泌,使用str字符串對象調(diào)用String類中的replaceAll()函數(shù)將字符串中的中間四位手機號替換成****,并重新生成一個字符串糊昙,并打印谢谦;


    13.png

1.4.5释牺、獲取

需求:案例:獲取字符串中的所有手機號碼
“shshska13966668888hdjd13966668888iaj”
正則的獲取功能指的是從一個字符串中截取出來我們需要的子串。
需要學(xué)習(xí)2個對象:
1回挽、正則表達式對象
2没咙、匹配器對象
正則表達式對象:正則表達式是計算機語言中存在一類具備特定功能的表達式,那么Java對這類表達式使用類的描述和封裝千劈。
正則表達式是在java中存在的一種規(guī)則祭刚,而java語言對于存在的事物,都會使用類來描述墙牌。在java.util.regex包中存在一個用來描述正則表達式的類:


14.png

通過查閱API涡驮,可以獲得:
1)Pattern類是最終的類,不能被繼承喜滨;
2)Pattern類是java中正則表達式的實例對象捉捅,而我們書寫好的一個正則表達式,被封裝成Pattern的對象之后虽风,這時我們就可以通過對象的方式來操作正則表達式棒口;
3)Pattern類沒有構(gòu)造函數(shù),我們不能直接new這個類的對象焰情。一般不能new對象的類陌凳,都會在這個類中給我們提供靜態(tài)的函數(shù)剥懒,獲取本類的對象内舟。所以需要使用compile()方法獲取Pattern類實例;
4)先要有Pattern類的實例(正則表達式的實例對象)初橘,通過實例對象創(chuàng)建匹配器對象(Matcher類)验游,最后是使用匹配器對象中的matcher方法來對正則進行驗證;


15.png

就可以把一個字符串形式的正則表達式保檐,變成Pattern對象耕蝉。
需求:定義一個手機號的正則表達式,使用Pattern類中的compile函數(shù)將定義好的正則表達式編譯成正則對象夜只。


16.png

說明:經(jīng)過對正則表達式的編譯垒在,我們就得到了一個正則對象,這個對象中封裝的就是那個正則表達式扔亥。
把正則表達式編譯成正則對象之后场躯,這時只有一個正則對象谈为,是無法和需要匹配或驗證的字符串進行關(guān)聯(lián)。
這時必須讓自己的正則對象和需要匹配的字符串通過中間的匹配器進行關(guān)聯(lián)踢关,然后才能去操作伞鲫。


17.png

匹配器對象:


18.png

在Pattern類中提供matcher函數(shù),可以讓當(dāng)前的正則對象與需要匹配的字符串進行關(guān)聯(lián)签舞,然后得到一個匹配器對象秕脓,我們通過這個匹配器對象就可以去通過正則操作字符串。

案例:獲取字符串中的所有手機號碼
“shshska13966668888hdjd13966668888iaj”

步驟:
1)定義一個手機號碼的正則表達式regex=”1[34578][0-9]{9}”;
2)使用Pattern類調(diào)用Pattern類中的compile函數(shù)對上述正則表達式進行編譯生成一個正則對象p儒搭;
3)定義一個字符串str=”sdjfklsdjf13867891234ksdjfuiotk”;
4)使用正則對象p調(diào)用Pattern類matcher函數(shù),str作為字符串吠架,生成一個匹配器對象matcher;
5)使用匹配器對象matcher調(diào)用Matcher類中的find()函數(shù)去字符串str中查找根據(jù)指定的正則表達式的結(jié)果搂鲫,找到手機號返回結(jié)果true诵肛,找不到返回false;
6)由于字符串可以有多個手機號默穴,所以使用while循環(huán)去查找怔檩,而matcher.find()作為while循環(huán)的循環(huán)條件;
7)使用匹配器對象matcher調(diào)用Matcher類中的group()函數(shù)找出符合正則的子字符串蓄诽;


19.png

說明:
1)find()表示根據(jù)正則表達式去字符串中查找薛训,如果找到,則返回true仑氛,找不到返回false乙埃;
2)group()表示根據(jù)正則表達式去字符串中找出符合正則的子字符串;

正則對象和匹配器的使用:
1锯岖、需要把一個正則表達式介袜,通過Pattern類中的compile函數(shù)編譯成正則對象;
2出吹、使用Pattern類中matcher方法讓正則對象和需要操作的字符串產(chǎn)生關(guān)系遇伞,得到一個匹配器對象;
3捶牢、使用匹配器中的find進行匹配鸠珠,使用group方法獲取到匹配到的字符串;

正則的功能:
字符串的匹配秋麸、切割渐排、替換、獲取
正則的符號:
. 表示任意的字符
() 對已經(jīng)存在的正則進行分組 同一正則引入組 \編號 灸蟆,不同 $編號
[] 某個字符串位置上可以出現(xiàn)的字符列表
{}當(dāng)前某個正則規(guī)則出現(xiàn)的次數(shù)
? 表示當(dāng)前的規(guī)則可以出現(xiàn)零次或一次

  • 表示當(dāng)前的規(guī)則可以出現(xiàn)零次或一次或多次
  • 表示當(dāng)前的規(guī)則可以出現(xiàn)一次或多次
    ^ 行開始
    $ 行結(jié)尾
    \d 數(shù)字字符 [0-9]
    \w 數(shù)字 字母 下劃線[0-9a-zA-Z_]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驯耻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌可缚,老刑警劉巖孽水,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異城看,居然都是意外死亡女气,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門测柠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炼鞠,“玉大人,你說我怎么就攤上這事轰胁≮酥鳎” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵赃阀,是天一觀的道長霎肯。 經(jīng)常有香客問我,道長榛斯,這世上最難降的妖魔是什么观游? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮驮俗,結(jié)果婚禮上懂缕,老公的妹妹穿的比我還像新娘。我一直安慰自己王凑,他們只是感情好搪柑,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著索烹,像睡著了一般工碾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上百姓,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天渊额,我揣著相機與錄音,去河邊找鬼瓣戚。 笑死端圈,一個胖子當(dāng)著我的面吹牛焦读,可吹牛的內(nèi)容都是我干的子库。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼矗晃,長吁一口氣:“原來是場噩夢啊……” “哼仑嗅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仓技,失蹤者是張志新(化名)和其女友劉穎鸵贬,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脖捻,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡阔逼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了地沮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗜浮。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖摩疑,靈堂內(nèi)的尸體忽然破棺而出危融,到底是詐尸還是另有隱情,我是刑警寧澤雷袋,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布吉殃,位于F島的核電站,受9級特大地震影響楷怒,放射性物質(zhì)發(fā)生泄漏蛋勺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一鸠删、第九天 我趴在偏房一處隱蔽的房頂上張望迫卢。 院中可真熱鬧,春花似錦冶共、人聲如沸乾蛤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽家卖。三九已至,卻和暖如春庙楚,著一層夾襖步出監(jiān)牢的瞬間上荡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工馒闷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酪捡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓纳账,卻偏偏與公主長得像逛薇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疏虫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容