天天看點

張小飛的Java之路——第四十五章——正規表達式

作者:小艾程式設計

寫在前面:

視訊是什麼東西,有看文檔精彩嗎?

視訊是什麼東西,有看文檔速度快嗎?

視訊是什麼東西,有看文檔效率高嗎?

1. 介紹

諸小亮:今天我們學習——正規表達式

張小飛:啥是正規表達式?

諸小亮:正規表達式——簡稱:正則,是一種文本規則,主要用來處理字元串資料,

例如:查詢、分割、替換等,實際開發中使用非常廣泛

張小飛:額。。。。,完全不懂

諸小亮:舉個例子,去某個王章新增賬號,都有一些要求,比如:

張小飛的Java之路——第四十五章——正規表達式

張小飛:是啊,這怎麼了?

諸小亮:上圖中對郵箱位址的要求,如果用普通的 if 判斷會比較麻煩,比如:

private static void checkEmail(String s) {
    String a_z = "abcdefghigklmnopqrstuvwxyz";
    String z_9 = "abcdefghigklmnopqrstuvwxyz0123456789_";
    int len = s.length();
    if(len <= 6 || len >= 18){
        System.out.println("長度不對");
    }else{
        char[] chars = s.toCharArray();
        if(!a_z.contains(chars[0]+"")){
            System.out.println("不是字母開頭");
        }else {
            for(char c : chars){
                if(!z_9.contains(c+"")){
                    System.out.println("隻能使用字母、數字、下劃線");
                }
            }
        }
    }
}           

張小飛:麻煩嗎?不就是多用了幾個 if 嘛

諸小亮:但是,使用正規表達式判斷就會簡單很多

private static void checkEmail(String s) {
    //表示首字母應該是a-z之間,剩下的由0-9a-z_之間的字元組成,{5,17}:表示除了首字母,剩下的長度>=5 && <=17
    String regex = "[a-z][0-9a-z_]{5,17}";
    //判斷字元串是否符合要求
    if(s.matches(regex)){
        System.out.println("符合要求");
    }else{
        System.out.println("不符合要求");
    }
}           

張小飛:還真是,這麼說,正則還是挺有用的

諸小亮:那當然,正則——由各種符号組成

好處:使用操作字元串更加簡單
弊端:閱讀性很差           

張小飛:嗯嗯,這倒是,閱讀性确實不好

諸小亮:其實學習正則,主要就是學習各種符号的使用,推薦一個網站:https://regex101.com/

2. 常用符号

張小飛:都有哪些符号?

諸小亮:正則中的符号分為好幾類:字元類、預定義字元、數量符号等

2.1. 字元類

諸小亮:第一種,[a-z]:表示 a-z 之間的任意一個字母,修改代碼中的正則

張小飛的Java之路——第四十五章——正規表達式

然後,傳入一個 ‘a’

張小飛的Java之路——第四十五章——正規表達式

結果:

張小飛的Java之路——第四十五章——正規表達式

張小飛:這麼說,傳入 'b'、'c'等,都是符号要求的?

諸小亮:不錯,隻要是 a-z 的字母,都符合要求

諸小亮:第二種,[abc]——表示 abc 中的任意一個字元

張小飛的Java之路——第四十五章——正規表達式

結果:

張小飛的Java之路——第四十五章——正規表達式

張小飛:明白了

諸小亮:還有一些其他的常見表達式

[^abc]:		除了 abc,都行
[a-zA-Z]:		可以是 a-z 或 A-Z 中的任意一個
[a-z&&[def]]:	a-z 和 [def]的交集
[0-9]:			可以是 0-9 中的任意一個           

2.2. 預定義字元

張小飛:什麼是預定義字元?

諸小亮:其實就是表示固定含義的字元,比如:"."——可以表示任意字元

張小飛:任意字元?

諸小亮:是的,'.[a-z]'——表示可以以任意字元開頭

張小飛:¥、#、%,這樣開頭也行嘛?

諸小亮:可以,記住——是任意字元

張小飛:明白了

諸小亮:其他的預定義字元有:

\d:表示數字[0-9],
\D:表示[^0-9]
\s:表示空白字元,比如:空格、回車、制表符(\t)
\S:非空白字元
\w:表示[a-zA-Z_0-9]
\W:表示[^\w]           

2.3. 數量符

張小飛:什麼是數量符?

諸小亮:就是表示某個字元出現幾次,比如:a?——表示 a 在字元串中出現一次,或者沒有出現

張小飛:‘?’就是1次或0次嗎?

諸小亮:是的

諸小亮:其他數量符

2. a*:		表示 a 在字元串中出現 0 次,或多次
3. a+:		表示 a 在字元串中出現 1 次,或多次
4. a{n}:	表示 a 在字元串中出現 n 次
5. a{n,}:	表示 a 在字元串中至少 n 次
6. a{n,m}:	表示 a 在字元串中至少 n 次,但不超過 m 次           

3. 常用功能

張小飛:說了這麼多符号,實際的用一下吧

諸小亮:這個要求很合理,無法拒絕

3.1. 比對

諸小亮:先給你一個例子,驗證手機号是否正确

String regex = "1[35678]\\d{9}";
// 1:表示1開頭
//[35678]:表示第2個字元是35678中的其中一個
//\\d{9}:表示剩下的必須是在[0-9]中,長度9           

諸小亮:判斷某個字元串 str 是否符合正則的要求,str.matches(regex)

3.2. 切割

諸小亮:String 的 split 方法用過吧

張小飛:當然用過了,切割字元串嘛

諸小亮:可以通過正則對字元串進行切割

public static void main(String[] args) throws IOException, ClassNotFoundException {
    String s = "yase,lvbu diaochan";

    //根據","和" "對字元串進行切割
    String[] arr = s.split("[, ]");//逗号 或者 空格
    for(String str : arr){
        System.out.println(str);
    }
}           

結果:

張小飛的Java之路——第四十五章——正規表達式

3.3. 替換

諸小亮:也可以對字元串中的一些字元進行替換,調用 String 的 replace 方法

public static void main(String[] args) throws IOException, ClassNotFoundException {
   	String s = "yase,lvbu diaochan";

    //替換字元串中的","和" "
    String s2 = s.replaceAll("[, ]", "----");
    System.out.println(s2);
}           

結果:

張小飛的Java之路——第四十五章——正規表達式

3.4. 查找

諸小亮:其實用的最多的應該是查找功能,擷取字元串中符合規則的子串

public static void main(String[] args) throws IOException, ClassNotFoundException {
    // 需求:查出字元串中"1"開頭的 3 位的數字
    String regex = "1\\d{2}";
    String string = "yase123lvbu12diaochan234change124";

    //1. 将規則編譯稱Pattern對象
    Pattern pattern = Pattern.compile(regex);

    //2. 跟字元串關聯擷取比對對象Matcher
    Matcher matcher = pattern.matcher(string);

    //3. 查找符合規則的子串
    while (matcher.find()) {
        System.out.println(matcher.group());
    }
}           

結果:

張小飛的Java之路——第四十五章——正規表達式

繼續閱讀