大家好,我是冰河~~
最近有很多小夥伴問我為啥會有那麼多的時間寫文章,錄視訊,好吧,今天我就給大家分享下我平時工作中會經常使用的一些小工具吧。
我用了兩天時間整理了這些工作用常用的正規表達式,熟練掌握這些,你能夠比其他人少些很多代碼,進而有更多的時間做自己的事情,小夥伴們拿走,不謝~
這次我把工作中總結的經常使用的正規表達式共享出來了,正是掌握了這些正規表達式,冰河平均每天比别人少寫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)))
小夥伴們可先收藏,後查閱這些常用的正規表達式!
好了,今天就到這兒吧,我是冰河,大家有啥問題可以留言,也可以在微信上私信我,我看到後都會回複大家,最後,小夥伴們點贊、在看、留言,轉發,走起呀~~
好了,今天就到這兒吧,我是冰河,我們下期見~~