1. 程式人生 > 其它 >正則表示式學習

正則表示式學習

正則表示式是一個幫助處理和匹配複雜字串的工具,regular expression(RegEx)

特點:

  1. 靈活,邏輯性和功能性非常強
  2. 可以迅速用極簡單的方式做到字串的複雜控制
  3. 對初學者不友好,比較晦澀難懂

常見用法:

  1. 郵箱驗證
  2. 密碼強度驗證
  3. 身份證號驗證
  4. 使用者名稱驗證
  5. 提取數字

字元集合[]

集合set是一對方括號[]內的一組字元,用來代表整個字元中的任意一個 例如:

[abc] 指定字元(a,b或c)之一[a-z]表示任何一個小寫字母[^abc]^ 表示否的意思,表達了除a,b,c外的任意字元[0246]代表 0,2,4,6的任意一個[0-9] 代表 0到9的任意一個數字[a-zA-Z]

任何一個大小寫字母[+] 在集合中 +、*、|、()、$、{}都沒有特殊含義,僅代表普通字元匹配[0-9]+ 這裡的加代表連續多個

常見萬用字元(核心)

萬用字元是一種特殊字元,一般指的是反斜槓\後面緊跟的一些特殊識別符號,用來指代某些字元集合

  • \d代表阿拉伯數字(只能匹配一個字元)
  • \D代表除了阿拉伯數字外的所有字元,可以理解為[^\d]
  • \s空白字元
  • \S除空白字元外的所有字元
  • \w任何單詞字元(字母、數字、漢字、下劃線_字元)
  • \W返回一個匹配項,其中字串不包含任何單詞字元不常用:
  • \A字串的開頭
  • \Z字串的末尾
  • \b返回指定字元位於單詞的開頭或者末尾的匹配項
  • \B不在單詞的開頭和結尾處

元字元(複雜重要)

在正則表示式中具有特殊含義的字元,具有很高的優先順序。例如[]\+都是元字元 在元字元中\的優先順序最高,其次為各種括號

  • \代表對隨後的萬用字元進行轉義,因此需要用\\表示\本身

若反斜槓後面沒有萬用字元,則反斜槓原樣輸出,就不再轉義

  • []用於限定字元集合

注意:使用[]時,再[]中間的特殊字元如.+?*:-等等都是看作普通字元,但若要將\[]看作普通字元,需要進行轉義,即使用\\表示\,使用\[來表示[

 [\w,]+
 //代表檢索所有連續的單詞字元或者連續的,  []中只能匹配一個字元
  • .英文的小數點,表示除換行符之外的任何一個字元

  • *

    代表前面的字元可以出現0次或多次

  • +代表一個或多個連續匹配的字元

  • ?非貪婪模式,表示匹配前面的字元0次或一次

  • +?將搜尋模式從貪婪模式改為非貪婪模式

    如果能匹配到,則匹配一個,不會匹配多個

  • {}表示的是前面表示式的確切的出現次數

    \d{2} 表示 匹配兩個數字 \d{2,4} 表示 匹配2-4個數字,2,3,4個 \d{2,} 表示2位到無限位

  • |管道符 代表選擇其中一個,一般按順序選擇,若前面的已被匹配,就不會匹配後面的

  • ()捕獲和分組

    括號內的字串將會作為捕獲的結果進行輸出,只會輸出括號內的匹配字串

  • ^代表字串的開始

  • 代表字串的結束

  • ?:表示非捕獲分組,匹配冒號後的內容抄但不獲取匹配結果,不進行儲存供以後使用。

使用捕獲組

let str = "abcc123dd1hg";
const regex = /(\d+)([a-zA-Z]+)/g
regex.exec(str);
console.log(`${RegExp.$1}----${RegExp.$2}---${RegExp.$0}`); //獲取捕獲組中捕獲的內容
//123----dd---undefined

密碼強度驗證

使用正則表示式來進行密碼強度驗證,一般密碼由數字、字母和特殊字元組成,若由一連串的數字或字母或特殊字元,這種密碼的安全性不高,而由其中兩種組成密碼強度一般,使用者密碼包含的字元種類越多,密碼的安全性越高

  1. 只有數字驗證(安全性較低)(六位以上的數字密碼)
\d{6,}
  1. 只有字母驗證(六位以上的字母密碼)
[a-zA-Z]{6,}
  1. 只有特殊字元的密碼(六位以上的特殊字元密碼)
[.-+?\\\[\]`/;'@#$%^&*():<>=~]{6,}

注意:在集合中寫[]和\時需要進行轉義,因為這兩個時元字元,優先順序較[]來說更高

解釋:

​ [\da-zA-Z]* 表示匹配空字串,或長度至少為1的由數字和字母組成的字串 ​ \d+[a-zA-Z]+表示1個或多個連續數字和1個或多個連續字母組成的字串 ​ 連起來就可以匹配一系列數字和字母組成的字串

  1. 數字與字母混合使用密碼
  [\da-zA-Z]*\d+[a-zA-Z]+[\da-zA-Z]*
  1. 數字和特殊字串混合使用
[\d.-+?\\\[\]`/;'@#$%^&*():<>=~]*\d+[.-+?\\\[\]`/;'@#$%^&*():<>=~]+[\d.-+?\\\[\]`/;'@#$%^&*():<>=~]*
  1. 三種字元混合使用(密碼強度比較高)
[\da-zA-Z.-+?\\\[\]`/;'@#$%^&*():<>=~]*  #0個或多個數字、字母和特殊字元的混合字串
((\d+[a-zA-Z]+[.-+?\\\[\]`/;'@#$%^&*():<>=~]+)|  #數字開頭
 (\d+[.-+?\\\[\]`/;'@#$%^&*():<>=~]+[a-zA-Z]+)| #數字開頭
 ([a-zA-Z]+\d+[.-+?\\\[\]`/;'@#$%^&*():<>=~]+)| #字母開頭
 ([a-zA-Z]+[.-+?\\\[\]`/;'@#$%^&*():<>=~]+\d+)| #字母開頭
 ([.-+?\\\[\]`/;'@#$%^&*():<>=~]+\d+[a-zA-Z]+)| #特殊字元開頭
 ([.-+?\\\[\]`/;'@#$%^&*():<>=~]+[a-zA-Z]+\d+)| #特殊字元開頭
)[\da-zA-Z.-+?\\\[\]`/;'@#$%^&*():<>=~]* 

郵箱驗證

一般郵箱在@前面會是數字和字母的混合,在其中間可能會混有_-.+,在@後面可能會帶有字母和數字然後.加上頂級域名或者會有兩個域名

^[\da-zA-Z.-_+]+@[\da-zA-Z_.-+]+[.][\da-zA-Z]{2,4}$

注意:想表示字元.時一定要加上[.],因為普通的.代表的是任意字元,而[.]代表的是字元.

身份證號驗證

身份證號由六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼組成

  1. 地址碼規則 以數字1-9開始,剩下的5位數字為0-9
   [1-9]\d{5}
  1. 年份碼規則 年份碼為4位,按現實情況來說現在只有18、19、20開頭的
(18|19|20)\d{2}
  1. 月份碼規則 由兩位數字組成,第一位若為0,則第二位是1-9;第一位若為1,則第二位為0、1或2 (0[1-9])|(1[0-2])
  2. 日期碼規則 若第一位取1-2,第二位可以取0-9;若第一位取0,則第二位取1-9,若第一位取3,則第二位可以取0-1
([1-2][0-9])|(0[1-9])|(3[0-1])
  1. 順序碼規則 順序碼為三位
\d{3}
  1. 校驗碼規則 校驗碼長一位,可以是數字可以是X或者x
[\dXx]
  1. 總結
^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([1-2][0-9])|(0[1-9])|(3[0-1]))\d{3}[\dXx]$

去掉頭尾空白字元

reg = /^\s+|\s+$/g;