原文地址 https://www.cnblogs.com/younShieh/p/17082522.html
❤如果本文對你有所幫助,不妨點個關注和推薦呀,這是對筆者最大的支援~❤
最近在最做一個軟體的註冊登入的功能,需要用到對密碼強度的判斷,並對當前輸入的密碼的強度進行輸出。需求裡對密碼分了三級,分別是低強度、中強度、高強度,但是沒有對什麼是低強度、什麼是高強度進行詳細分類,所以自己在做的時候簡單做了下分類。對密碼分類後,我想到的是使用Regex表示式直接判斷密碼的強度,密碼字串輸入然後輸出對應強度等級就行。
這裡用到Regex表示式,雖然還是經常使用,但是對其語法還是一知半解。主要一般用到都比較簡單,不需要多重判斷。在網上一番搜尋後,基本沒有找到符合我要求的Regex表示式。雖然可以用if...else...進行進行分步判斷,但是對於我等強迫症而言,能用一句程式碼說明的事情絕對不寫第二句。所以還是頭疼了好一會的。大體看了下別人怎麼寫的,簡單對照了下語法設計,然後開始著手自己的密碼強度判斷Regex表示式的書寫。
首先完成對密碼強度等級的分類。密碼為6-16位元,分為低、中、高3個等級。密碼是大小寫字母,數位,英文標點的隨機組合。密碼強度等級對照表:
長度 | 描述 | 強度 |
---|---|---|
6<=長度<=8 | 純數位 | 低 |
- | 純數位 | 低 |
- | 純字母 | 低 |
- | 純英文標點 | 低 |
- | 數位+字母 | 中 |
- | 數位+標點 | 中 |
- | 字母+標點 | 中 |
- | 數位+字母+標點 | 高 |
9<=長度<=12 | 純數位 | 中 |
- | 純字母 | 中 |
- | 純英文標點 | 中 |
- | 數位+字母 | 高 |
- | 數位+標點 | 高 |
- | 字母+標點 | 高 |
- | 數位+字母+標點 | 高 |
13<=長度<=16 | 所有 | 高 |
Regex表示式再複雜也逃不過最基礎的與或非關係,我們完全可以從這方面對複雜的Regex表示式進行拆分。
在此之前需要理解以下幾種符號的含義。
拿低強度的密碼來說,首先需要滿足6-8位元,其次全是數位或全是字母或全是標點符號,只滿足這兩個條件的就是低強度的密碼。拆分開後就好實現了。
先看怎麼實現滿足6-8位元的表示式。
^\S{6,8}$ //任何非空白字元,且滿足6-8位元
匹配都是數位的情況。
^\d+$
匹配都是字母的情況。
^[A-Za-z]+$
匹配都是符號的情況。
^[!@#$%^&*?=]+$
拼接在一起,就是低強度密碼的正規表示式:
(?=^\d+$|^[A-Za-z]+$|^[!@#$%^&*?=]+$)^\S{6,8}$
匹配6-8位元同時包含數位+字母的情況。可以理解為包含數位、字母的字串,但不全是數位或不全是字母。
(?=.*\d)(?=.*[A-Za-z])(?=^[\dA-Za-z]+$)^\S{6,8}$
匹配6-8位元同時包含數位+標點(!@#$=%^&*?)的情況。同上。
(?=.*\d)(?=.*[!@#$=%^&*?])(?=^[\d!@#$=%^&*?]+$)^\S{6,8}$
匹配6-8位元同時包含字母+標點的情況。同上。
(?=.*[A-Za-z])(?=.*[!@#$%^&*?])(?=^[A-Za-z!@#$=%^&*?]+$)^\S{6,8}$
然後再加上匹配9-12位元純數位,純字母,純標點的情況。與之前的寫法相同。