[Swift] 在Swift中使用正規表示式來驗證密碼
我們很常在開發程式中遇到需要驗證密碼的問題,這種時候使用正規表示式可以很好的幫我們解決問題。
強度高的密碼通常有以下要求:
- 長度
- 包含大小寫英文字母、數字
- 特殊字元
- 等等
在寫程式的時候也許你會用if-else
來驗證密碼,但是這樣往往會使程式變得複雜不可讀,使用正規表示式的話我們可以用僅僅兩行就做完驗證。讓我們先來介紹正規表示式
正規表示式 Regular expressions (regex)
根據WIKI的定義,正規表示式可以用形式化語言理論的方式來表達。正規表示式由常數和算子組成,它們分別表示字串的集合和在這些集合上的運算。
以下文章我們將使用Swift中的NSPredicate,來驗證密碼,且只會介紹正規表示式當中的一小部分,想了解更詳細的正規表示式請參閱WIKI。
示例
以下示範包含
- 至少包含a-z其中一個字母(區分大小寫)
- 至少包含一個特殊字元
- 長度至少6個字
let password = NSPredicate(format: "SELF MATCHES %@ ", "^(?=.*[a-z])(?=.*[$@$#!%*?&]).{6,}$")
password.evaluate(with: "pas$word") // 回傳True
password.evaluate(with: "password") // 回傳False
讓我們一一拆解
format: "SELF MATCHES %@ "
:NSPredicate的格式選用正規表示式。NSPredicate的其他用法可以參考這篇文章:七天學會 swift - NSPredicate Day4
^
:符合輸入字串的開始位置
$
:符合輸入字串的結束位置
(?=...)
:如果括號內的模式在當前輸入位置匹配,則為True
.*
:盡可能多地匹配任何字符
[a-z]
、[A-Z]
、[0-9]
、[$@$#!%*?&]
:字元範圍,這裡表達字母a-z、A-Z、數字0-9、特殊字元
{6,}
:字串長度,這裡表示至少6個字元,{6,12}
則表達6-12個字元
設定好規則後再使用.evaluate(with:String)
方法對String做驗證,回傳是否符合格式要求。
這邊再給第二個例子
- 至少一個a-z的字母
- 至少一個特殊字元
- 至少一個A-Z的字母
- 長度9-10個字
let password = NSPredicate(格式: "SELF MATCHES %@", "^(?=.*[az])(?=.*[$@$#!%*?&])(?=.*[AZ] ).{9,10}$")
password.evaluate(with: "Password!") // True
password.evaluate(with: "Pas$word") // False
password.evaluate(with: "password") // False
password.evaluate(with: "MyPassword!") // False
小結
看到這邊大家都對如何使用正規表示式來做密碼驗證有點概念了吧,而正規表示式對於任何語言基本上都有用,學會了之後不只侷限在Swift的開發上,哪天換語言了也都能夠使用,是不是非常方便呢!