天天看點

全網最全正則實戰指南,拿走不謝

大家好,我是冰河~~

最近有很多小夥伴問我為啥會有那麼多的時間寫文章,錄視訊,好吧,今天我就給大家分享下我平時工作中會經常使用的一些小工具吧。

我用了兩天時間整理了這些工作用常用的正規表達式,熟練掌握這些,你能夠比其他人少些很多代碼,進而有更多的時間做自己的事情,小夥伴們拿走,不謝~

這次我把工作中總結的經常使用的正規表達式共享出來了,正是掌握了這些正規表達式,冰河平均每天比别人少寫200行代碼,極大的提高了研發效率,建議小夥伴們收藏,平時嘗試着使用到自己的項目中!!

熟練的掌握正規表達式,能夠幫助程式員以最快的速度寫出最優雅的代碼。

冰河在多年的程式設計工作中,對使用過的正規表達式進行了梳理和總結,這些正規表達式能夠幫助你節省很多的編碼時間,往往一個簡單的正規表達式就能夠省略大量的​

​if...else...​

​代碼。

這次,冰河向小夥伴們公開了自己平時經常使用的正規表達式,希望能夠為小夥伴們帶來實質性的幫助。

冰河常用正則

整數或者小數

^[0-9]+\.{0,1}[0-9]{0,2}$      

隻能輸入數字

^[0-9]*$      

隻能輸入n位的數字

^\d{n}$      

隻能輸入至少n位的數字

^\d{n,}$      

隻能輸入m~n位的數字

^\d{m,n}$      

隻能輸入零和非零開頭的數字

^(0|[1-9][0-9]*)$      

隻能輸入有兩位小數的正實數

^[0-9]+(.[0-9]{2})?$      

隻能輸入有1~3位小數的正實數

^[0-9]+(.[0-9]{1,3})?$      

隻能輸入非零的正整數

^\+?[1-9][0-9]*$      

隻能輸入非零的負整數

^\-[1-9][]0-9*$      

隻能輸入長度為3的字元

^.{3}$      

隻能輸入由26個英文字母組成的字元串

^[A-Za-z]+$      

隻能輸入由26個大寫英文字母組成的字元串

^[A-Z]+$      

隻能輸入由26個小寫英文字母組成的字元串

^[a-z]+$      

隻能輸入由數字和26個英文字母組成的字元串

^[A-Za-z0-9]+$      

隻能輸入由數字、26個英文字母或者下劃線組成的字元串

^\w+$      

驗證使用者密碼:

^[a-zA-Z]\w{5,17}$      

注:正确格式為:以字母開頭,長度在6~18之間,隻能包含字元、數字和下劃線。

驗證是否含有​

​^%&',;=?$\​

​等字元

[^%&',;=?$\x22]+      

隻能輸入漢字

^[\u4e00-\u9fa5]{0,}$      

驗證Email位址

^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$      

驗證Internet URL

^[http|https]://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$      

驗證電話号碼

^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$      

正确格式為:XXX-XXXXXXX、XXXX- XXXXXXXX、XXX-XXXXXXX、XXX-XXXXXXXX、XXXXXXX和XXXXXXXX

驗證身份證号(15位或18位數字)

^\d{15}|\d{18}$      

驗證一年的12個月

^(0?[1-9]|1[0-2])$      

正确格式為:01~09和1~12

驗證一個月的31天

^((0?[1-9])|((1|2)[0-9])|30|31)$      

正确格式為;01~09和1~31

比對中文字元的正規表達式

[\u4e00-\u9fa5]      

比對雙位元組字元(包括漢字在内)

[^\x00-\xff]      

比對空行的正規表達式

\n[\s| ]*\r      

比對html标簽的正規表達式

<(.*)>(.*)<\/(.*)>|<(.*)\/>      

比對首尾空格的正規表達式

(^\s*)|(\s*$)      

比對Email位址的正規表達式

\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*      

比對HTML标記的正規表達式

<(\S*?)[^>]*>.*?|<.*? />      

評注:網上流傳的版本太糟糕,上面這個也僅僅能比對部分,對于複雜的嵌套标記依舊無能為力

比對首尾空白字元的正規表達式

^\s*|\s*$      

評注:可以用來删除行首行尾的空白字元(包括空格、制表符、換頁符等等),非常有用的表達式

比對Email位址的正規表達式

\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*      

評注:表單驗證時很實用

比對網址URL的正規表達式

[a-zA-z]+://[^\s]*      

評注:網上流傳的版本功能很有限,上面這個基本可以滿足需求

比對賬号是否合法(字母開頭,允許5-16位元組,允許字母數字下劃線)

^[a-zA-Z][a-zA-Z0-9_]{4,15}$      

評注:表單驗證時很實用

比對國内電話号碼

\d{3}-\d{8}|\d{4}-\d{7}      

評注:比對形式如 0511-4405222 或 021-87888822

比對騰訊QQ号

[1-9][0-9]{4,}      

評注:騰訊QQ号從10000開始

比對中國郵政編碼

[1-9]\d{5}(?!\d)      

評注:中國郵政編碼為6位數字

比對身份證

\d{15}|\d{18}      

評注:中國的身份證為15位或18位

比對ip位址

\d+\.\d+\.\d+\.\d+      

評注:提取ip位址時有用

比對特定數字

^[1-9]\d*$ //比對正整數
^-[1-9]\d*$ //比對負整數
^-?[1-9]\d*$ //比對整數
^[1-9]\d*|0$ //比對非負整數(正整數 + 0)
^-[1-9]\d*|0$ //比對非正整數(負整數 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //比對正浮點數
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //比對負浮點數
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //比對浮點數
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //比對非負浮點數(正浮點數 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$//比對非正浮點數(負浮點數 + 0)s      

評注:處理大量資料時有用,具體應用時注意修正。

比對特定字元串

^[A-Za-z]+$//比對由26個英文字母組成的字元串
^[A-Z]+$//比對由26個英文字母的大寫組成的字元串
^[a-z]+$//比對由26個英文字母的小寫組成的字元串
^[A-Za-z0-9]+$//比對由數字和26個英文字母組成的字元串
^\w+$//比對由數字、26個英文字母或者下劃線組成的字元串      

評注:最基本也是最常用的一些表達式

校驗密碼強度例如密碼的強度為:包含大小寫字母和數字的組合,不能使用特殊字元,長度在8-10之間。

^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$      

校驗字元串

中文。

^[\\u4e00-\\u9fa5]{0,}$      

由數字、26個英文字母或下劃線組成的字元串

^\\w+$      

校驗E-Mail 位址

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

校驗身份證号碼15位:

^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$      

18位:

^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$      

校驗日期“yyyy-mm-dd“ 格式的日期校驗,已考慮平閏年。

^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$      

校驗金額精确到2位小數。

^[0-9]+(.[0-9]{2})?$      

校驗手機号下面是國内 13、15、18開頭的手機号正規表達式。(可根據目前國内收集号擴充前兩位開頭号碼)

^(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}$      

判斷IE的版本

^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$      

校驗IP-v4位址

\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b      

校驗IP-v6位址

(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))      

檢查URL的字首

應用開發中很多時候需要區分請求是HTTPS還是HTTP,通過下面的表達式可以取出一個url的字首然後再邏輯判斷。

if (!s.match(/^[a-zA-Z]+:\\/\\//))
{
    s = 'http://' + s;
}      

提取URL連結

下面的這個表達式可以篩選出一段文本中的URL。

^(f|ht){1}(tp|tps):\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- ./?%&=]*)?      

檔案路徑及擴充名校驗驗證windows下檔案路徑和擴充名(下面的例子中為.txt檔案)

^([a-zA-Z]\\:|\\\\)\\\\([^\\\\]+\\\\)*[^\\/:*?"<>|]+\\.txt(l)?$      

提取網頁顔色代碼有時需要抽取網頁中的顔色代碼,可以使用下面的表達式。

^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$      

提取網頁圖檔

\\< *[img][^\\>]*[src] *= *[\\"\\']{0,1}([^\\"\\'\\ >]*)      

提取頁面超連結

(<a\\s*(?!.*\\brel=)[^>]*)(href="https?:\\/\\/)((?!(?:(?:www\\.)?'.implode('|(?:www\\.)?', $follow_list).'))[^"]+)"((?!.*\\brel=)[^>]*)(?:[^>]*)>      

查找CSS屬性

^\\s*[a-zA-Z\\-]+\\s*[:]{1}\\s[a-zA-Z0-9\\s.#]+[;]{1}      

抽取注釋

<!--(.*?)-->      

比對HTML标簽

<\\/?\\w+((\\s+\\w+(\\s*=\\s*(?:".*?"|'.*?'|[\\^'">\\s]+))?)+\\s*|\\s*)\\/?>      

時間正則案例

簡單的日期判斷(YYYY/MM/DD)

^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$      

演化的日期判斷(YYYY/MM/DD| YY/MM/DD)

^(^(\d{4}|\d{2})(\-|\/|\.)\d{1,2}\3\d{1,2}$)|(^\d{4}年\d{1,2}月\d{1,2}日$)$      

加入閏年的判斷的

執行個體:

^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$      

分析:

什麼是合法的日期範圍?對于不同的應用場景,這個問題有不同的解釋。這裡采納MSDN中的約定:

DateTime值類 型表示 值 範 圍 在公元(基督 紀 元)0001 年 1 月 1 日午夜12:00:00 到公元 (C.E.) 9999年12月31日晚上11:59:59之間的日期和時間

關于閏年的闡釋。

關于公曆閏年是這樣規定的:地球繞太陽公轉一周叫做一回歸年,一回歸年長365日5時48分 46秒。是以,公曆規定有平年和閏年,平年一年有365日,比回歸年短0.2422日,四年共短0.9688日,故每四年增加一日,這一年有366日,就是閏年。但四年增加一日比四個回歸年又多0.0312日,400年後将多3.12日,故在400年中少設3個閏年,也就是在400年中隻設97個閏年,這樣公曆年的平均長度與回歸年就相近似了。由此規定:年份是整百數的必須是400的倍數才是閏年,例如1900年、2100年就不是閏年。

首先需要驗證年份,顯然,年份範圍為 0001 - 9999,比對 YYYY 的正 則 表達式為:

[0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}      

其中 [0-9] 也可以表示為 \d,但 \d 不如 [0-9] 直覺,是以下面我将一直采用 [0-9]

用正規表達式驗證日期的難點有二:一是大小月份的天數不同,二是閏年的考慮。

對于第一個難點,我們首先不考慮閏年,假設2月份都是28天,這樣,月份和日期可以分成三種情況:

(1)月份為 1, 3, 5, 7, 8, 10, 12,天數範圍為 01 - 31,比對MM-DD的正規表達式為:

(0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])      

(2)月份為 4, 6, 9, 11,天數範圍為 01-30,比對MM-DD的正規表達式為:

(0[469]|11)-(0[1-9]|[12][0-9]|30)      

(3)月份為 2,考慮平年情況,比對MM-DD的正規表達式為:

02-(0[1-9]|[1][0-9]|2[0-8])      

根據上面的成果,我們可以得到比對平年日期格式為YYYY-MM-DD的正規表達式:

([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))      

接着我們來解決第二個難點:閏年的考慮。根據閏年的定義,我們可以将閏年分為兩類:

(1)能被4整除但不能被100整除的年份。尋找後兩位的變化規律,可以很快得到下面的正則比對:

([0-9]{2})(0[48]|[2468][048]|[13579][26])      

(2)能被400整除的年份。能被400整除的數肯定能被100整除,是以後兩位肯定是00,我們隻要保證前兩位能被4整除即可,相應的正規表達式為:

(0[48]|[2468][048]|[3579][26])00      

最強驗證日期的正規表達式,添加了閏年的驗證

這個日期正規表達式支援的日期格式如下所示。

YYYY-MM-DD 
YYYY/MM/DD 
YYYY_MM_DD 
YYYY.MM.DD      

完整的正規表達式如下

((^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(10|12|0?[13578])([-\/\._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(11|0?[469])([-\/\._])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(0?2)([-\/\._])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([3579][26]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][13579][26])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][13579][26])([-\/\._])(0?2)([-\/\._])(29)$))      

閏年的2月份有29天,是以比對閏年日期格式為YYYY-MM-DD的正規表達式為:

(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29      

最後,将平年和閏年的日期驗證表達式合并,我們得到最終的驗證日期格式為YYYY-MM-DD的正規表達式為:

(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)      

DD/MM/YYYY格式的正則驗證表達式為:

(((0[1-9]|[12][0-9]|3[01])/((0[13578]|1[02]))|((0[1-9]|[12][0-9]|30)/(0[469]|11))|(0[1-9]|[1][0-9]|2[0-8])/(02))/([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}))|(29/02/(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00)))      

小夥伴們可先收藏,後查閱這些常用的正規表達式!

好了,今天就到這兒吧,我是冰河,大家有啥問題可以留言,也可以在微信上私信我,我看到後都會回複大家,最後,小夥伴們點贊、在看、留言,轉發,走起呀~~

好了,今天就到這兒吧,我是冰河,我們下期見~~

寫在最後

繼續閱讀