概述
在JS密碼校驗中常常會遇到密碼強度的校驗需求,借用一位朋友提問的圖,他在工作中遇到的一個比較經典的密碼強度校驗要求:
這個需求有兩個難點,一,是如何使用正則匹配所有半角英文標點符號,二,是如何驗證密碼段中在要求的四種(大寫字母,小寫字母,數字,標點符號)類型中至少存在三種。
首先,我們來解決第一個難點:如何使用正則匹配所有半角英文標點符號。
太長不看版:
滿足需求:使用js正則匹配所有半角英文標點符號(不含大小寫字母)
解決方案:使用正則表達式:/[\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]/
詳細說明
一般使用正則表達式匹配標點符號的常用做法是並:直接在正則表達式中書寫標點符號並對需要轉義的標點符號加""進行轉義。
如匹配文章中的句號、問號和嘆號(半角符號)可以寫成:
<script>
var reg = /[\?\!\.]/;
</script>
但如果需要匹配的英文符號不是少數的幾個,而是全部,這種一個一個的寫法就顯得很臃腫。為了解決這種寫法臃腫的問題,那我們就可以將目光投向另一種正則表達式中支持的字符表示模式:ASCII碼字符。
ASCII(pronunciation: /ˈæski/ ASS-kee,American Standard Code for Information Interchange,美國信息交換標准代碼)是基於拉丁字母的一套電腦編碼系統。它主要用於顯示現代英語,而其擴展版本EASCII則可以部分支持其他西歐語言,並等同於國際標准ISO/IEC 646。由於萬維網使得ASCII廣為通用,直到2007年12月,逐漸被Unicode取代。
在正則表達式中既支持ASCII碼字符,同時也支持unicode碼字符,但為了節省表達式長度,在這里我們選用了ASCII碼進行處理。
下圖為ASCII碼的經典對照表:
引用自百度百科
比如我們要校驗文章中的問號,使用ASCII碼編寫正則就可以寫為:
<script>
var reg = /\x3F/;
</script>
而且因為半角符號在ASCII編碼中排列較為連續,故可以采用 "-" 進行連接,每個符號具體的十六進制ASCII編碼數可通過查表獲取。最后拼成的正則表達式為:
<script>
var reg = /[\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]/;
</script>
即能滿足匹配所有半角英文符號的需求。