1. 程式人生 > >Java 從入門到進階之路(十七)

Java 從入門到進階之路(十七)

在之前的文章我們介紹了一下 Java 中類的內部類,本章我們來看一下 Java 中的正則表示式。

 在任何一種語言中,都繞不開正則表示式,而且大部分語言的正則表示式都有預定義的字符集,且預定義的字符集也都差不多,如下:

 

 上面的預定義字符集,在JavaScript,Java,Python 中其實是通用的,那接下來我們就利用 Java 的語法來對其進行一下解釋。

1 public class HelloWorld {
2     public static void main(String[] args) {
3         String regex = ".";
4         String string1 = "A";
5         String string2 = "AB";
6         System.out.println(string1.matches(regex)); // true
7         System.out.println(string2.matches(regex)); // false
8     }
9 }

在上面的程式碼中,我們定義了一個 . 的正則表達,.  表示任意一個字元,不能多也不能少,如上,我們通過 matches 方法匹配一個 . 時,"A" 我 true,"B" 為 false;那我們就可以一次類推 \d \w \s 同樣也是匹配一個字元,並且必須符合其中的規矩。

那我國我們想輸出大於一位的該如何做呢,如下:

 1 public class HelloWorld {
 2     public static void main(String[] args) {
 3         // + 表示至少出現一次,可以出現多次
 4         String regex1 = "[A-Z]+";
 5         String string1 = "A";
 6         String string2 = "AB";
 7         System.out.println(string1.matches(regex1)); // true
 8         System.out.println(string2.matches(regex1)); // true
 9 
10         /**
11          * {2,3}
12          * 逗號前面表示最少出現 2 次
13          * 逗號後面表示最多出現 3 次
14          *
15          * {2,} 表示最少出現 2 次,最多不限
16          * {0,2} 如果想表示最多出現次數,最少此時不限,則必須逗號前面為 0,不能為空
17          *
18          * */
19         //
20         String regex2 = "[A-Z]{2,3}";
21         String string3 = "A";
22         String string4 = "AB";
23         String string5 = "ABCD";
24         System.out.println(string3.matches(regex2)); // false
25         System.out.println(string4.matches(regex2)); // true
26         System.out.println(string5.matches(regex2)); // false
27 
28         // ? 表示至多出現一次
29         String regex3 = "[A-Z]?";
30         String string6 = "A";
31         String string7 = "AB";
32         System.out.println(string6.matches(regex3)); // true
33         System.out.println(string7.matches(regex3)); // false
34     }
35 }

在上面的程式碼中,我們實現了單一字元的次數問題,但是如果想要匹配的並非單一字元,比如 "ABC" 該如何實現呢,如下:

 1 public class HelloWorld {
 2     public static void main(String[] args) {
 3         // () 內的將會被視為一個整體
 4         String regex1 = "(ABC)+";
 5         String string1 = "AB";
 6         String string2 = "ABC";
 7         System.out.println(string1.matches(regex1)); // false
 8         System.out.println(string2.matches(regex1)); // true
 9 
10         // | 表示 或 的意思
11         String regex2 = "(ABC|DEF)+";
12         String string3 = "ABC";
13         String string4 = "ABCDEF";
14         System.out.println(string3.matches(regex2)); // true
15         System.out.println(string4.matches(regex2)); // true
16 
17     }
18 }

在上面的程式碼中,我們發現,我們可以通過 () 將想要匹配的整體內容括起來,這樣就解決了匹配非單一字元的問題,並且 | 表示或的意思,可以讓我們更有選擇性的匹配。

當然正則的匹配遠不止上面所講的這些,這只是寫基礎用法,當然我們根據這些基礎用法其實就可以完成一些我們想要的正則匹配。

接下來我們根據上面所說的做一個簡單的郵箱的正則匹配:

[email protected][email protected][email protected]

上面的三個郵箱可能是我們常用的郵箱,他們在結構上都滿足一些共同的特徵:數字或字母下劃線 @ 數字或字母下劃線 . 數字或字母下劃線 . 數字或字母下劃線

那我們就可以根據上面的特徵來做一個正則的驗證:

 1 public class HelloWorld {
 2     public static void main(String[] args) {
 3         /**
 4          * \w 或 [a-zA-Z0-9_] 都表示任意字母數字或下劃線
 5          * (\.\w) 表示任意一個 .字串
 6          * 注意:. 在正則中表示任意一個字元,所以前面需要加 \ 來將其轉義
 7          *
 8          * */
 9         // \ 在 Java 中只是個普通的字元,所以在前面加一個 \ 將其轉義,簡單理解就是正則中如果出現 \ 就在前面再加一個 \
10         String regex = "[a-zA-Z0-9_]+@\\w+(\\.[a-zA-Z0-9_]+)+";
11         System.out.println(regex); // [a-zA-Z0-9_]+@\w+(\.[a-zA-Z0-9_]+)+
12         String mail = "[email protected]";
13         boolean flag = mail.matches(regex); // true
14         if (flag) {
15             System.out.println("是郵箱");
16         } else {
17             System.out.println("不是郵箱");
18         }
19     }
20 }

 

我們同樣可以根據上面的內容來做一個手機號碼的正則驗證:

 1 public class HelloWorld {
 2     public static void main(String[] args) {
 3         /**
 4          * 1[0,9]{10} 手機號碼以 1 開頭,後面為 10 為數字
 5          * (\+86|0086)?\s* 手機號前面可能會加 86 或 0086 以及 空格 這些
 6          * + 在正則表示式中有特殊含義,所以加 \ 轉義
 7          * */
 8         String regex = "(\\+86|0086)?\\s*1[1-9]{10}";
 9         System.out.println(regex); // (\+86|0086)?\s*1[1-9]{10}
10         String phone = "+86 13666666666";
11         boolean flag = phone.matches(regex); // true
12         if (flag) {
13             System.out.println("是電話號碼");
14         } else {
15             System.out.println("不是電話號碼");
16         }
17     }
18 }