之前我都沒想過能夠用 Regular Expressions 驗證複雜格式的密碼,原來能夠用 Regular Expression 中的羣組建構式達成這個目的,例如說密碼的條件是這樣: post
那麼你的 Regular Expression 能夠長這樣: spa
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,30}$
在這段 Regular Expression 的語法中值得注意的就是 (?=.*\d) 這段語法,這段於法又稱作「右合樣 (Positive Lookahead)」,右合樣(或左合樣)語法所佔用的寬度為 0,也就是說這段語法本真不會佔用比對的字元,僅僅只是 Regular Expression 中的一種「判斷式」而已,右合樣 (Positive Lookahead)會判斷右邊緊接著的字元是否符合比對條件,若是符合條件才會繼續比對下去。 code
因此剛剛這段於法的解釋大體能夠這樣說明: blog
(?=.*\d) 與 (?=.*[a-z]) 與 (?=.*[A-Z]) 寬度都會是零,因此整個字串比對會以 .{6,30} 為主,但比對以前會分別比對 (?=.*\d) 與 (?=.*[a-z]) 與 (?=.*[A-Z]) 這三個判斷式,都判斷成功才會進行 .{6,30} 的比對。因此 (?=.*\d) 的 .*\d 就是說右邊的文字中必定要出現一個數字符號,(?=.*[a-z]) 的 .*[a-z] 就是說右邊的文字中必定要出現一個小寫字母,(?=.*[A-Z]) 的 .*[A-Z] 就是說右邊的文字中必定要出現一個大小字母,最後才會比對 .{6,30} 也就是說比對字串的長度必須在 6 ~ 30 個字的任意字元。 rpc
若是你的條件修改爲: get
那麼你的 Regular Expression 能夠長這樣(以 C# 做範例): it
Regex regex = new Regex(@"^(?=.*\d)(?=.*[a-zA-Z])(?=.*\W).{6,30}$");
這樣一來你知道如何融會貫通了嗎?^_^ io
相關連結 class