正則表達式簡單學習與經常使用表達式

正則表達式的概念

正則表達式(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

  • 字符:\\
     含義: 表明的是反斜線字符'\'
     例:  匹配規則爲"\\" ,那麼匹配的字符串內容就是 」\」
  • 字符類:[abc]
     含義: 表明的是字符a、b 或 c
     例:  匹配規則爲"[abc]" ,那麼匹配的內容就是字符a,或者字符b,或字符c的一個
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
  • 字符類:[^abc]
     含義: 表明的是除了 a、b 或 c之外的任何字符
     例:  匹配規則爲"[^abc]",那麼匹配的內容就是非字符a,或非字符b,或非字符c的任意一個字符
  • 字符類:[a-zA-Z]
     含義: 表明的是a 到 z 或 A 到 Z,兩頭的字母包括在內
     例:  匹配規則爲"[a-zA-Z]",那麼匹配的是一個大寫或者一個小寫字母字符
  • 字符類:[0-9]
     含義: 表明的是 0到9數字,兩頭的數字包括在內
     例:  匹配規則爲"[0-9]",那麼匹配的是一個數字
  • 字符類:[a-zA-Z0-9_]
     含義: 表明的是字母或者數字或者下劃線
     例:  匹配規則爲" [a-zA-Z_0-9] ",那麼匹配的是一個字母或者是一個數字或一個下劃線
  • 邊界匹配符:^/$
     含義: 表明的是行的開頭/結尾
     例:  匹配規則爲^[abc][0-9]$,表示:必須以a,b,c三個字符的其中一個開頭;以0-9中其中一個結尾,而且該字符串只能是兩位
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
  • 數量詞:X?
     含義: 表明的是X出現一次或一次也沒有
     例:  匹配規則爲"a?",表示該字符以a開頭,而且a出現一次或0次。(要麼是"a",要麼爲"",若是有多個字符或者是其餘單字符,都爲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
  • 數量詞:X+
     含義: 表明的是X出現一次或屢次
     例:  匹配規則爲"fa+",表示該字符以f開頭,而且a出現一次或屢次
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
  • 數量詞:X*
     含義: 表明的是X出現零次或屢次
     例:  匹配規則爲"fa*" ,表示該字符以f開頭,而且a出現0次或屢次

限定符

字符 描述
? 匹配前面的子表達式零次或一次。例如,"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' 字符。

例如:編碼

  • 字符:\t
     含義: 製表符
     例:  效果是產生一個製表符的空間
  • 字符:\n
     含義: 換行符
     例:  效果是換行,光標在原有位置的下一行
  • 字符:\r
     含義: 回車符
     例:  效果是回車後的效果,光標來到下一行行首

java使用正則簡單示例

字符串類中涉及正則表達式的經常使用方法

/**
 *    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#

經常使用正則表達式

1、校驗數字的表達式

  • 數字:^[0-9]*$
  • n位的數字:^\d{n}$
  • 至少n位的數字:^\d{n,}$
  • m-n位的數字:^\d{m,n}$
  • 零開頭的數字:^(0[0-9]*)$
  • 非零開頭的最多帶兩位小數的數字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
  • 帶1-2位小數的正數或負數:^(-)?\d+(.\d{1,2})$
  • 正數、負數、和小數:^(-|+)?\d+(.\d+)?$
  • 有兩位小數的正實數:^[0-9]+(.[0-9]{2})?$
  • 有1~3位小數的正實數:^[0-9]+(.[0-9]{1,3})?$
  • 非零的正整數:^[1-9]\d$ 或 ^([1-9][0-9]){1,3}$ 或 ^+?[1-9][0-9]*$
  • 非零的負整數:^-[1-9][0-9]$ 或 ^-[1-9]\d$
  • 非負整數:^\d+$ 或 ^[1-9]\d*|0$
  • 非正整數:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
  • 非負浮點數:^\d+(.\d+)?$ 或 ^[1-9]\d.\d|0.\d[1-9]\d|0?.0+|0$
  • 非正浮點數:^((-\d+(.\d+)?)|(0+(.0+)?))$ 或
    ^(-([1-9]\d.\d|0.\d[1-9]\d))|0?.0+|0$
  • 正浮點數:^[1-9]\d.\d|0.\d[1-9]\d$ 或
    ^(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$
  • 負浮點數:^-([1-9]\d.\d|0.\d[1-9]\d)$ 或
    ^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$
  • 浮點數:^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d.\d|0.\d[1-9]\d|0?.0+|0)$

2、校驗字符的表達式

  • 漢字:^[\u4e00-\u9fa5]{0,}$
  • 英文和數字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
  • 長度爲3-20的全部字符:^.{3,20}$
  • 由26個英文字母組成的字符串:^[A-Za-z]+$
  • 由26個大寫英文字母組成的字符串:^[A-Z]+$
  • 由26個小寫英文字母組成的字符串:^[a-z]+$
  • 由數字和26個英文字母組成的字符串:^[A-Za-z0-9]+$
  • 由數字、26個英文字母或者下劃線組成的字符串:^\w+$ 或 ^\w{3,20}$
  • 中文、英文、數字包括下劃線:^[\u4E00-\u9FA5A-Za-z0-9_]+$
  • 中文、英文、數字:^[\u4E00-\u9FA5A-Za-z0-9]+$
  • 能夠輸入含有%&',;=?$"等字符:[%&',;=?$\x22]+
  • 禁止輸入含有~的字符:[^~\x22]+

3、特殊需求表達式

  • 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 😃😃 若有異常,請留言通知

相關文章
相關標籤/搜索