2011-11-16 116 views
3

我正在創建一些正則表達式代碼,以便在客戶嘗試創建帳戶時檢查密碼。目前我有兩段代碼在測試時似乎可以工作: - http://www.regexplanet.com/simple/index.html正則表達式密碼檢查器

的第一位是:

^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$ 

這可以確保:

  • 密碼長度爲8位
  • 至少包含一個一個小寫字母,一個大寫字母,一個數字和一個特殊字符

第二部分是:

\S*(.)\1{3,}\S* 

這可以確保:

任何4個或更多連續的相同字符匹配。

問題是,我怎樣才能將它們結合起來呢?我試圖無濟於事,但他們似乎一直很好地工作。

謝謝

+6

閱讀:http://xkcd.com/936/ – NullUserException

+0

首先,您應該注意,由於存在正則表達式錯誤,這些(?=)lookahead在Internet Explorer的Javascript中不起作用:http://blog.stevenlevithan .com/archives/regex-lookahead-bug和http://regexadvice.com/blogs/mash/archive/2009/02/21/Looking-again-at-the-Lookahead-bug.aspx –

+0

任何不檢查的原因他們分開?總的來說,我可能更喜歡做幾個簡單的檢查,而不是一個大規模的檢查。這樣當你稍後再回頭看看它,或者另一個開發人員來看它時,它會明白它在做什麼。如果由於使用兩個正則表達式而不是一個正在看到性能問題,我會非常驚訝... – Chris

回答

0

爲什麼不只是運行兩個單獨的測試?上面的正則表達式很複雜。保持它們分離將使代碼更易於理解,並且還可以靈活地添加/刪除額外的測試,而不會觸及已經工作的模式。另外,根據哪個測試失敗,您可以向用戶提供更詳細的錯誤消息。

+0

謝謝,最後我採取了這種方法。 – Sad

1

您可能想考慮允許密碼大於,然後至少12個字符。幫你一個忙,讓你的客戶幫忙,讓客戶使用任何大小超過12個字符的密碼。小於12的任何東西都非常容易暴力破解。

至於你的問題,我會讓其他人回答。

+0

a)這應該是一個評論(線索是在你的答案時,你說這不是一個答案)b)他目前的正則表達式似乎允許超過8個字符的密碼。 – Chris

+0

如果他們願意,他們可以輸入255個字符的密碼。要求不是我的,它是堅持ISO27001。 – Sad

+0

@克里斯 - 我不得不說的是渴望評論。問題出現的方式使得看起來正常的表達是將密碼限制爲8個字符。由於某種原因,我沒有複製相同的reg表達式,有3個人評論說,但8個字符爲短的點是有效的。 –

1

如果你簡單地將第二個正則表達式與第一個正則表達式組合起來,你將要求所有的密碼包含四個連續的相同的字符,我敢肯定你想要禁止這個。試試這個:

^(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?:(.)(?!\1{3}))+$ 

最後一組在同一時間捕捉一個字符,每次做一個負前瞻,以確保它沒有後跟三個以上相同的性質。請注意,我從第一個正則表達式的開頭刪除了.*。那從來沒有屬於那裏,雖然它並沒有真正傷害任何事情。但是在這個正則表達式中,最後一組必須是消費角色的唯一部分,否則它就沒有任何好處。