[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的開發上,哪天換語言了也都能夠使用,是不是非常方便呢!