Regex正則表達(dá)式判斷密碼強(qiáng)度
需求
最近在最做一個(gè)軟件的注冊(cè)登錄的功能,需要用到對(duì)密碼強(qiáng)度的判斷,并對(duì)當(dāng)前輸入的密碼的強(qiáng)度進(jìn)行輸出。需求里對(duì)密碼分了三級(jí),分別是低強(qiáng)度、中強(qiáng)度、高強(qiáng)度,但是沒有對(duì)什么是低強(qiáng)度、什么是高強(qiáng)度進(jìn)行詳細(xì)分類,所以自己在做的時(shí)候簡(jiǎn)單做了下分類。對(duì)密碼分類后,我想到的是使用Regex表達(dá)式直接判斷密碼的強(qiáng)度,密碼字符串輸入然后輸出對(duì)應(yīng)強(qiáng)度等級(jí)就行。
這里用到Regex表達(dá)式,雖然還是經(jīng)常使用,但是對(duì)其語法還是一知半解。主要一般用到都比較簡(jiǎn)單,不需要多重判斷。在網(wǎng)上一番搜索后,基本沒有找到符合我要求的Regex表達(dá)式。雖然可以用if...else...進(jìn)行進(jìn)行分步判斷,但是對(duì)于我等強(qiáng)迫癥而言,能用一句代碼說明的事情絕對(duì)不寫第二句。所以還是頭疼了好一會(huì)的。大體看了下別人怎么寫的,簡(jiǎn)單對(duì)照了下語法設(shè)計(jì),然后開始著手自己的密碼強(qiáng)度判斷Regex表達(dá)式的書寫。
在線測(cè)試Regex
正文
密碼強(qiáng)度分類
首先完成對(duì)密碼強(qiáng)度等級(jí)的分類。密碼為6-16位,分為低、中、高3個(gè)等級(jí)。密碼是大小寫字母,數(shù)字,英文標(biāo)點(diǎn)的隨機(jī)組合。密碼強(qiáng)度等級(jí)對(duì)照表:
長(zhǎng)度 | 描述 | 強(qiáng)度 |
---|---|---|
6<=長(zhǎng)度<=8 | 純數(shù)字 | 低 |
- | 純數(shù)字 | 低 |
- | 純字母 | 低 |
- | 純英文標(biāo)點(diǎn) | 低 |
- | 數(shù)字+字母 | 中 |
- | 數(shù)字+標(biāo)點(diǎn) | 中 |
- | 字母+標(biāo)點(diǎn) | 中 |
- | 數(shù)字+字母+標(biāo)點(diǎn) | 高 |
9<=長(zhǎng)度<=12 | 純數(shù)字 | 中 |
- | 純字母 | 中 |
- | 純英文標(biāo)點(diǎn) | 中 |
- | 數(shù)字+字母 | 高 |
- | 數(shù)字+標(biāo)點(diǎn) | 高 |
- | 字母+標(biāo)點(diǎn) | 高 |
- | 數(shù)字+字母+標(biāo)點(diǎn) | 高 |
13<=長(zhǎng)度<=16 | 所有 | 高 |
Regex分析
Regex表達(dá)式再復(fù)雜也逃不過最基礎(chǔ)的與或非關(guān)系,我們完全可以從這方面對(duì)復(fù)雜的Regex表達(dá)式進(jìn)行拆分。
在此之前需要理解以下幾種符號(hào)的含義。
符號(hào) | 描述 |
---|---|
^ | 匹配輸入字符串的開始位置 |
$ | 匹配輸入字符串的結(jié)束位置 |
. | 匹配除 "\n" 之外的任何單個(gè)字符 |
* | 匹配前面的子表達(dá)式零次或多次 |
+ | 匹配前面的子表達(dá)式一次或多次 |
? | 匹配前面的子表達(dá)式零次或一次 |
\d | 匹配一個(gè)數(shù)字字符。等價(jià)于[0-9] |
\S | 匹配任何非空白字符 |
[xyz] | 字符種類。匹配?括號(hào)內(nèi)的任意字符 |
(xyz) | 字符集,匹配與 xyz 完全相等的字符串 |
[a-z] | 匹配 'a' 到 'z' 范圍內(nèi)的任意小寫字母字符 |
(?=x) | 正向肯定預(yù)查詢包含x |
{4,8 | }匹配4到8位長(zhǎng)度的字符 |
| | 或運(yùn)算符 |
\ | 轉(zhuǎn)義字符,?于匹配?些保留的字符{}.*+?^$\| |
[^x] | 匹配除了x以外的任意字符 |
拿低強(qiáng)度的密碼來說,首先需要滿足6-8位,其次全是數(shù)字或全是字母或全是標(biāo)點(diǎn)符號(hào),只滿足這兩個(gè)條件的就是低強(qiáng)度的密碼。拆分開后就好實(shí)現(xiàn)了。
先看怎么實(shí)現(xiàn)滿足6-8位的表達(dá)式。
^\S{6,8}$ //任何非空白字符,且滿足6-8位
匹配都是數(shù)字的情況。
^\d+$
匹配都是字母的情況。
^[A-Za-z]+$
匹配都是符號(hào)的情況。
^[!@#$%^&*?=]+$
拼接在一起,就是低強(qiáng)度密碼的正則表達(dá)式:
(?=^\d+$|^[A-Za-z]+$|^[!@#$%^&*?=]+$)^\S{6,8}$
中強(qiáng)度密碼同理。
匹配6-8位同時(shí)包含數(shù)字+字母的情況。可以理解為包含數(shù)字、字母的字符串,但不全是數(shù)字或不全是字母。
(?=.*\d)(?=.*[A-Za-z])(?=^[\dA-Za-z]+$)^\S{6,8}$
匹配6-8位同時(shí)包含數(shù)字+標(biāo)點(diǎn)(!@#$=%^&*?)的情況。同上。
(?=.*\d)(?=.*[!@#$=%^&*?])(?=^[\d!@#$=%^&*?]+$)^\S{6,8}$
匹配6-8位同時(shí)包含字母+標(biāo)點(diǎn)的情況。同上。
(?=.*[A-Za-z])(?=.*[!@#$%^&*?])(?=^[A-Za-z!@#$=%^&*?]+$)^\S{6,8}$
然后再加上匹配9-12位純數(shù)字,純字母,純標(biāo)點(diǎn)的情況。與之前的寫法相同。
高強(qiáng)度密碼同理。
補(bǔ)充:密碼強(qiáng)度 弱 中 強(qiáng) 正則表達(dá)式判斷
今天看了下項(xiàng)目中的注冊(cè)頁源碼,順帶著看了下判斷密碼強(qiáng)度的正則表達(dá)式,寫的很好,最起碼比我寫的好,所以記錄下來留著以后參考
代碼如下
var strongRegex = new RegExp("^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\\W).*$", "g") ?//強(qiáng) var mediumRegex = new RegExp("^(?=.{7,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$", "g") ?//中 var enoughRegex = new RegExp("(?=.{6,}).*", "g") //弱
用input 的keyup() 方法每輸入一個(gè)字符用 正則的 enoughRegex.test(password) 方法去檢測(cè)密碼
本人之前也學(xué)過正則表達(dá)式的一點(diǎn)皮毛,下面從強(qiáng)到弱解釋下這三句正則的規(guī)則,如果有說的不對(duì)的地方歡迎大神拍磚,共同學(xué)習(xí)進(jìn)步!
強(qiáng) ==> 密碼長(zhǎng)度大于等于8位數(shù) 包含大寫字母[A-Z] + 小寫字母[a-z] + 數(shù)字[0-9] + 非單詞字符的特殊字符[標(biāo)點(diǎn)符號(hào),空格啥的這些] 結(jié)尾
中 ==> 密碼長(zhǎng)度大于等于7位數(shù) 大寫字母[A-Z] + 小寫字母[a-z] 或者 大寫字母[A-Z] + 數(shù)字[0-9] 或者 小寫字母[a-z] + 數(shù)字[0-9] + 任意字符 結(jié)尾
弱 ==> 大于等于6位 任何字符或者數(shù)字 (如果達(dá)不到這個(gè)條件就是弱,所以這里需要用false判斷)
到此這篇關(guān)于Regex正則表達(dá)式判斷密碼強(qiáng)度的文章就介紹到這了,更多相關(guān)正則表達(dá)式判斷密碼強(qiáng)度內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript正則表達(dá)式校驗(yàn)非零的負(fù)整數(shù)實(shí)例
本文分享了JavaScript正則表達(dá)式(^-[1-9]\d*$)校驗(yàn)非零的負(fù)整數(shù)實(shí)例代碼,代碼簡(jiǎn)單易懂,需要的朋友可以看下2016-12-12淺析一個(gè)匹配數(shù)字和字母密碼的正則表達(dá)式
最近做項(xiàng)目,遇到這樣的需求,要求由數(shù)字和字母組成,并且要同時(shí)含有數(shù)字和字母,且長(zhǎng)度要在8-16位之間。下面給大家分享實(shí)現(xiàn)代碼,要求看看吧2017-06-06javascript中使用正則表達(dá)式刪除前后空格的方法
去掉前后位空格的方法有很多種,下面腳本之家小編給大家分享使用js正則表達(dá)式如何刪除前后空格,感興趣的朋友跟著一起學(xué)習(xí)學(xué)習(xí)吧2015-09-09java正則表達(dá)式四種常用的處理方式(匹配、分割、替代、獲?。?/a>
這篇文章主要為大家詳細(xì)介紹了java正則表達(dá)式四種常用的處理方式,包括匹配、分割、替代、獲取四種,感興趣的小伙伴們可以參考一下2016-06-06js使用正則子表達(dá)式匹配首字母與尾字母相同單詞的方法
這篇文章主要介紹了js使用正則子表達(dá)式匹配首字母與尾字母相同單詞的方法,可實(shí)現(xiàn)將多行文本框中首位字母相同的單詞進(jìn)行匹配的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01根據(jù)身份證號(hào)碼計(jì)算出生日期、年齡、性別(18位) 根據(jù)入職時(shí)間計(jì)算工齡。
適用于OA項(xiàng)目中這些對(duì)檔案的管理,需要的朋友可以參考下2012-08-08php中常用的正則表達(dá)式的介紹及應(yīng)用實(shí)例代碼
在編寫處理字符串的程序或網(wǎng)頁時(shí),經(jīng)常會(huì)有查找符合某些復(fù)雜規(guī)則的字符串的需要。正則表達(dá)式就是用于描述這些規(guī)則的語法。2009-12-12php中正則替換函數(shù)ereg_replace用法實(shí)例
這篇文章主要介紹了php中正則替換函數(shù)ereg_replace用法,以實(shí)例形式分析了ereg_replace函數(shù)進(jìn)行正則替換時(shí)的用法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12