常見的Regex表達式(更新RFC標準的email檢驗)

數字(Number)

除正常的數字(digit)以外,還有可能包括正、負號,科學計數法,小數位,甚至用逗號分隔千分位。html

邏輯規則:git

  • 起始位後必定是+/-號,也能夠沒有 ^[+-]?
  • 至少有一位以上的數字 \d+
  • 可能會跟着千分位分隔的逗號,暫時不考慮是否必定是3位分隔,規則能夠出現一次或屢次 (,\d+)*
  • 若是是小數那麼必定是小數點後帶有至少一位以上的數字,規則僅能出現一次 (.\d+)
  • 若是是科學計數法,則前面必定是小數,後面跟有e和次冪,規則僅能出現一次 (.\d+(e\d+))
  • 任何數字的結尾必須是數字

知足上述條件檢驗數字的正則表達式爲:^[+-]?\d+(,\d+)*(.\d+(e\d+)?)?$正則表達式

符合該條件的example包括:瀏覽器

  • 3 (整數)
  • 3.14 (小數)
  • +3.14 (帶有+標識數字)
  • -2.5 (帶有-標識數字)
  • 128,234 (會計計數法)
  • 1.9e10 (科學計數法)

且過濾掉小數點重複出現屢次,科學技術法不合規或重複出現屢次,非數字如720p的字符串
此處尤爲要注意科學的條件,前面必須是合法小數後面是e和次冪,注意次冪必須有。服務器


電話號碼(Phone Numbers)

美國的電話號碼規則:總計10位數字,但有可能帶有國家號碼1。能夠接受的輸入格式包括:dom

  • xxx-xxx-xxxx
  • xxx xxx xxxx
  • (xxx)xxx-xxxx
  • xxxxxxxxxx
  • 1 上述格式組合
  • +1 上述格式組合

知足上述條件檢驗美國電話的正則表達式爲:^(+?1[\s-])?(?\d{3})?[\s-]?\d{3}[\s-]?\d{4}$ide

進一步能夠將國家號的驗證修改成(+?\d+[\s-])?,這樣就能夠支持諸如+86, 86 , 86-這樣的格式了。函數

中國的手機規則:總計11位數字,通常狀況下不加上任何特殊符號的分隔。若是僅考慮如下4種格式:翻譯

  • xxxxxxxxxxx
  • +86-xxxxxxxxxxx
  • +86 xxxxxxxxxxx
  • +86xxxxxxxxxxx

知足上述條件檢驗中國手機號碼的正則表達式爲:^(+86[\s-]?)?\d{11}$code


郵件(Email)

因爲工做須要,更詳細的查閱了RFC對於郵件地址的標準要求。Google了好久竟然始終沒有找到一份靠譜的中文翻譯。在此共享給你們,但願你們不用再去痛苦的翻那RFC晦澀的文檔。

根據RFC 3696的規定,郵件地址(Email Address)被@符號分割爲如下兩個組成部分:local name和domain name.

Local Name

  • 長度不超過64個字符
  • 能夠由除@、反斜槓()、雙引號("")、逗號和方括號([ ])以外,任何ASCII Graphic字符組成。
  • 可使用句號(.),可是不能出如今首尾的位置
  • 對於一些特殊狀況,如老舊的系統、特殊目的的服務器,可使用所有ASCII字符(包括控制字符在內),可是必須使用反斜槓轉義單個字符,或者使用雙引號轉義整個字符串。

Domain Name

  • 長度不超過255個字符
  • 只可使用字母、數字和短橫線(-)
  • 可使用短橫線(-),可是不能出如今首尾的位置
  • 其他的要求包括頂級域名的白名單,每一級域名不能夠超過64個字符、不可所有由數字組成等等

對於平常使用中,忽略Local Name第4點的要求1和Domain Name對域名合法性的過濾,可使用以下正則表達式檢驗Email的合法性:

^[A-Za-z0-9!#$%&'+/=?^_`{|}~-]+(.[A-Za-z0-9!#$%&'+/=?^_`{|}~-]+)*@([A-Za-z0-9]+(?:-[A-Za-z0-9]+)?.)+[A-Za-z0-9]+(-[A-Za-z0-9]+)?$

若是使用Javascript的話,能夠經過split函數,進一步檢驗每一部分的長度。

isemail: function(string){
    if(typeof string === "string"){
        var regex = /^[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@([A-Za-z0-9]+(?:-[A-Za-z0-9]+)?\.)+[A-Za-z0-9]+(?:-[A-Za-z0-9]+)?$/;
        var temp = string.split("@");
        return regex.test(string) && temp[0].length <= 64 && temp[1].length <= 255;
     }
     else{
         return false;
     }
}

郵件的格式較爲複雜,雖然實際上容許多級域名,只要長度保證在255個字符之內便可。不過更加常見的狀況是,考慮@前面使用字符和.的狀況,以及@後面可能會有二級域名的狀況。若是不要求嚴格性而只是起到對於用戶的提示做用的話,知足上述條件檢驗郵件的正則表達式爲:^[\w.]+(+[\w.]+)?@\w+(.\w+){1,2}$

若是可能的話,理解了原理以後,仍是更加推薦使用成熟的庫自帶的email檢驗函數,畢竟重複造輪子不是一件很是有效率的事情。


密碼(Password)

不一樣強度的密碼,
要求至少包含數字或字母:[\da-zA-Z]\d+[a-zA-Z]+[\da-zA-Z]

必須數字、字母和特殊字符3種混排的:
(\d+[a-zA-Z]+[-=\\\[\];',./~!@#$%^&*()_+|{}:"<>?]+) #數字開頭 |(\d+[-=\[];',./~!@#$%^&()_+|{}:"<>?]+[a-zA-Z]+) #數字開頭
|([a-zA-Z]+\d+[-=\\\[\];',./~!@#$%^&*()_+|{}:"<>?]+) #字母開頭 |([a-zA-Z]+[-=\[];',./~!@#$%^&
()+|{}:"<>?]+\d+) #字母開頭
|([-=\\\[\];',./~!@#$%^&*()_+|{}:"<>?]+\d+[a-zA-Z]+) #特殊字符開頭 |([-=\[];',./~!@#$%^&*()
+|{}:"<>?]+[a-zA-Z]+\d+) #特殊字符開頭


IP地址

IP地址是由4個使用句號(.)分割的數字序列組成,每段的數值取值在0-255之間。
因爲數字會被當成字符看待,而沒有大小關係,使用正則表達式檢驗數字範圍是一件很是麻煩的事情。

檢驗IP地址的正則表達式以下:
(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]).{3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])

使用Javascript,稍微優雅一點的表達方式

ip: function(string){
    var octet = '(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])';
    var ip    = '(?:' + octet + '\\.){3}' + octet;
    var ipRE  = new RegExp( '^' + ip + '$' );
    return ipRE.test(string);
}

HTML

HTML更爲推薦使用其餘的方式而非正則表達式進行過濾。
獲取Tag:<(\w+)
獲取Tag內容:>([\w\s])<
獲取Attribute的值:='([\w://.]
)


更新記錄

2014年9月5日修改
本來的正則表達式中沒有考慮到yeelan0319@sf.com.32y8498這樣的內容也會被斷定爲true。仍是對於正則表達式並不是「所有字符串匹配」,而是隻要出現「符合正則表達式規定的內容便可」的理解不夠透徹。說來講去最後好像仍是推薦使用已經成熟的庫比較好,畢竟重複造輪子是一件太過於低效率的事情

2015年3月4日修改
根據RFC規定,更新了符合RFC詳細要求的email的正則表達式。
添加了IP地址的檢驗正則


  1. 雖然此處沒有考慮Local Name的第4點要求,可是RFC中其實規定,瀏覽器(Client Side)端檢驗不該該拒絕該格式的輸入,而應該交由郵件服務器實際在執行過程當中判斷其合法性,由於這樣的格式實際上是徹底合法的。此處實際上是我偷懶了。 

相關文章
相關標籤/搜索