正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),能夠用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。html
參照JDk1.9 Api,在java.util.regex.Pattern類中有正則表達式的規則定義,值得注意的是:正則表達式中明確區分字母大小寫java
普通字符指沒有明確指定爲元字符的全部字符。這包括全部大寫和小寫字母、全部數字、全部標點符號和一些其餘符號。
例如:正則表達式
import java.util.regex.Pattern; String str = "test"; String pattern = "test"; boolean isMatch = Pattern.matches(pattern, str); System.out.println("str字符串是不是\"test\"? "+ isMatch); // 輸出結果: str字符串是不是"test"? true
特殊字符指在正則表達式中,含有特定意義的字符,例如經常使用的'\',它表示轉義的意思(改變這個字符串原來的意義)
許多元字符要求在試圖匹配它們時特別對待。若要匹配這些特殊字符,必須首先使字符"轉義",即,將反斜槓字符\ 放在它們前面。下表列出了正則表達式中的特殊字符:express
特殊字符 | 描述 |
---|---|
\ | 改變下一個字符的原有意義:將特殊字符轉義爲原義字符、將原義字符標記爲特殊字符、向後引用、八進制轉義符。例如: 'n' 匹配字符 'n','\n' 匹配換行符。 '\\' 匹配 "\",而 '\{' 則匹配 "{"。 |
{ | 表示限定符表達式的開始。要匹配 {,請使用 \{。 |
$ | 表示輸入字符串的結尾。若是設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符自己,請使用 \$。 |
( ) | 標記一個子表達式的開始和結束位置。子表達式能夠獲取供之後使用。要匹配這些字符,請使用 \( 和 \)。 |
* | 匹配前面的子表達式零次或屢次。要匹配 * 字符,請使用 \*。 |
* | 匹配前面的子表達式一次或屢次。要匹配 + 字符,請使用 \+。 |
? | 匹配前面的子表達式零次或一次。要匹配 ? 字符,請使用 \?。 |
. | 匹配除換行符 \n 以外的任何單字符。要匹配 . ,請使用 \. 。 |
[ | 標記一箇中括號表達式的開始。要匹配 [,請使用 \[。 |
^ | 匹配輸入字符串的開始位置,除非在方括號表達式中使用,當該符號在方括號表達式中使用時,表示不接受該方括號表達式中的字符集合。要匹配 ^ 字符自己,請使用 \^。 |
| | 指明兩項之間的一個選擇。要匹配 |,請使用 \|。 |
例如:api
String pattern = "[abc]"; String srt1 = "a"; String srt2 = "ab"; boolean isMatch1 = Pattern.matches(pattern, srt1); System.out.println("str1字符串是不是a、b、c三個中的其中一個?"+isMatch1); // str1字符串是不是a、b、c三個中的其中一個?true boolean isMatch2 = Pattern.matches(pattern, srt2); System.out.println("str2字符串是不是a、b、c三個中的其中一個?"+isMatch2); // str2字符串是不是a、b、c三個中的其中一個?false
String pattern = "^[abc][0-9]$"; String srt1 = "a5"; boolean isMatch1 = Pattern.matches(pattern, srt1); System.out.println("str1匹配結果:"+isMatch1); // str1匹配結果:true String srt2 = "af"; boolean isMatch2 = Pattern.matches(pattern, srt2); System.out.println("str2匹配結果"+isMatch2); // str2匹配結果:false String srt3 = "afg5"; boolean isMatch3 = Pattern.matches(pattern, srt3); System.out.println("str3匹配結果"+isMatch3); // str3匹配結果:false
String pattern = "a?"; String srt1 = "a"; boolean isMatch1 = Pattern.matches(pattern, srt1); System.out.println("str1匹配結果:"+isMatch1); // str1匹配結果:true String srt2 = ""; boolean isMatch2 = Pattern.matches(pattern, srt2); System.out.println("str2匹配結果:"+isMatch2); // str2匹配結果:true String srt3 = "f"; boolean isMatch3 = Pattern.matches(pattern, srt3); System.out.println("str3匹配結果:"+isMatch3); // str3匹配結果:false
String pattern = "fa+"; String srt1 = "faa"; boolean isMatch1 = Pattern.matches(pattern, srt1); System.out.println(isMatch1);// 輸出:true String srt2 = "aa"; boolean isMatch2 = Pattern.matches(pattern, srt2); System.out.println(isMatch2);// 輸出:false String srt3 = "fafa"; boolean isMatch3 = Pattern.matches(pattern, srt3); System.out.println(isMatch3);// 輸出:false String srt4 = "f"; boolean isMatch4 = Pattern.matches(pattern, srt4); System.out.println(isMatch4);// 輸出:false
字符 | 描述 |
---|---|
? | 匹配前面的子表達式零次或一次。例如,"do(es)?" 能夠匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等價於 {0,1}。 |
* | 匹配前面的子表達式一次或屢次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。 |
* | 匹配前面的子表達式零次或屢次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價於{0,}。 |
{n} | n 是一個非負整數。匹配肯定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',可是能匹配 "food" 中的兩個 o。 |
{n,} | n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的全部 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*'。 |
{n,m} | m 和 n 均爲非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。 |
非打印字符也是正則表達式的組成部分。下表列出了一些非打印字符:oracle
字符 | 描述 |
---|---|
\f | 匹配一個換頁符 |
\n | 匹配一個換行符 |
\r | 匹配一個回車符 |
\s | 匹配任何空白字符,包括空格、製表符、換頁符等。等價於[\f\n\r\v\t]。PS:Unicode正則表達式會匹配全角空格符 |
\S | 匹配任何非空白字符,等價於[^\f\n\r\v\t]。PS:與\s相反 |
\t | 匹配一個製表符。 |
\v | 匹配一個垂直製表符。 |
\cx | 匹配由x指明的控制字符。例如, \cM 匹配一個 Control-M 或回車符。x 的值必須爲 A-Z 或 a-z 之一。不然,將 c 視爲一個原義的 'c' 字符。 |
例如:編碼
/** * matches(String regex):判斷字符串是否匹配給定的規則 * 校驗qq號碼.規則:[1-9][0-9]{4,14} * 1: 要求必須是5-15位數字 * 2: 0不能開頭 */ public void matchesTest(){ String qq = "604154942"; String regex = "[1-9][0-9]{4,14}"; boolean flag = qq.matches(regex); }
/** * split(String regex):根據給定正則表達式的匹配規則,拆分此字符串 * 分割出字符串中的的數字:_ * 經過"_"拆分 */ public void splitTest01(){ String s = "18-22-40-65"; String regex = "-"; String[] result = s.split(regex); System.out.println(result);//[18,22,40,65]15 } /** * 按空格分割出字符串中的的數字: + * 18 22 40 65 * 注意:當有多個空格的時候,正則條件不能單純的寫成「 」(空格),這樣只會匹配一個空格,切出來的數據不符合咱們要求, * 要寫成「 +」("空格+"),+表示匹配一個或多個 */ public void splitTest02(){ String s = "18 22 40 65"; String regex = " +"; String[] result = s.split(regex); System.out.println(result);//[18,22,40,65] }
/** * 切IP地址:「\\.」 */ public void splitTest03(){ Spring ip = "127.0.0.1"; // "."在正則中有特殊含義,經過轉譯符"\"將其轉譯 Spring regex = "\\."; Spring[] result = ip.split(regex); }
/** * replaceAll(String regex,String replacement):將符合規則的字符串內容,所有替換爲新字符串 * 將數字替換成#號 */ public void replaceAllTest01(){ String s = "Hello12345World6789012"; // "\\d"匹配的是一個位置是否爲數字 String regex = "[\\d]"; String result = s.replaceAll(regex, "#"); System.out.println(result); // 結果是:Hello#####World####### } /** * 將數字替換成一個#號 */ public void replaceAllTest02(){ String s = "Hello12345World6789012"; // "\\d"匹配的是一個位置是否爲數字,+表示一個或多個,注意+不能寫[]裏面 String regex = "[\\d]+"; String result = s.replaceAll(regex, "#"); System.out.println(result); // 結果是:Hello#World#
Email地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$3d
域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
InternetURL:[a-zA-z]+://[^\s]* 或
^http://([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$code
手機號碼:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$xml
電話號碼("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$
國內電話號碼(0511-440522二、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
電話號碼正則表達式(支持手機號碼,3-4位區號,7-8位直播號碼,1-4位分機號):
((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)
身份證號(15位、18位數字),最後一位是校驗位,可能爲數字或字符X:(\d{15}$)|(\d{18}$)|(^\d{17}(\d|X|x)$)
賬號是否合法(字母開頭,容許5-16字節,容許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線):^[a-zA-Z]\w{5,17}$
強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字符,長度在 8-10
之間):^(?=.\d)(?=.[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$
強密碼(必須包含大小寫字母和數字的組合,可使用特殊字符,長度在8-10之間):^(?=.\d)(?=.[a-z])(?=.*[A-Z]).{8,10}$
日期格式:^\d{4}-\d{1,2}-\d{1,2}
一年的12個月(01~09和1~12):^(0?[1-9]|1[0-2])$
一個月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\.[x|X][m|M][l|L]$
空白行的正則表達式:\n\s*\r (能夠用來刪除空白行)
騰訊QQ號:[1-9][0-9]{4,} (騰訊QQ號從10000開始)
中國郵政編碼:[1-9]\d{5}(?!\d) (中國郵政編碼爲6位數字)
IP地址:((?: (?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))
😃😃 持續更新ing 😃😃 若有異常,請留言通知