2011-07-08 32 views
1

行,所以我有心理障礙,當談到正則表達式 - 但有人告訴我,拿出一個正則表達式,它滿足以下條件:強密碼的正則表達式

  • 必須至少8個字符(簡單! )
  • 必須具有來自4個不同的字符類型的至少3個字符 - 大寫,小寫,數字,符號(OK)
  • 必須具有至少5個不同的字符
  • 不能具有的長序列相同的字符類型(例如asdnme​​會被認爲是不好的,因爲它是l的一個長序列奧爾情況下)
(?=^.{8,255}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9\s])(?=.*[a-z])|(?=.*[^A-Za-z0-9\s])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9\s])) 

這正則表達式滿足1和2。但我在努力尋找實例3和4

如果任何正則表達式愛好者可以幫助我 - 我們將不勝感激。 :)

注:我不想使用正則表達式 - 這是我問任何人是否有可能使用正則表達式檢查第3和第4種情況?請不要因爲正則表達式是唯一的解決方案而信任我。我不相信 - 我們的achitect決定用最少的努力參與使用正則表達式來解決這個問題。

我個人認爲這個級別的密碼安全性會讓系統無法使用!但也許我不在乎密碼安全:)

注意:我們正在嘗試使用Microsoft ASPNET成員 - 正則表達式。這就是爲什麼我認爲它需要成爲一個單一的表達。我知道,嘗試閱讀/理解是很可怕的。

如果任何人都可以提供單獨的正則表達式的表達式 - 必須具有至少5個不同的字符 - 不能具有相同的字符類型的長序列(例如asdnme​​將被認爲是不好的作爲其下殼體的長序列) - 假設5個序列太長..

或者c#代碼/ javascript?雖然這是特定的客戶 - 我們不希望它空白應用於所有客戶端。這可能是爲什麼架構師想要一個很好的正則表達式,您可以在部署時插入。 :(

發現別人的例子,在.NET工作

^(([AZ])(*()\ 1 {2}?!)|?([AZ])|( ?\ d)|((數字)([^ A-ZA-Z \ d])){8}((上)((下????)|((非字母數字)|?(?)) )|((數字?)((非字母數字)|?()?!)|))(?!)|((下)((數字?)((非字母數字)|?()?!)|(? !))|(?!)))$

不幸的是,滿足這些條件:

  • 必須有8個字符的最小長度

  • 必須包含三個以下四個類型的字符:

  • 英文大寫字母(A - Z)

  • 英文小寫字母(a - z)

  • 數值數字(0 - 9)

  • 非字母數字字符

  • 沒有字符可以成一排,例如重複3次或更多次BB(字母B兩次)OK,但BBB(字母B三次)不正確。

但沒有檢測到至少5個不同的字符用於:(

沒關係 - 下面的答案似乎工作唯一的事情是,它似乎允許4個不同的字符,而不是要求。 ?5

我已經調整了它是: ^((= {8,}?):???(= \ d)(= [AZ])(= [ (φ=。 \ d)(?=。[^ A-Za-z0-9 \ s])(?=。 [az])| 10 [^ A-Za-z0-9 \ s])(?=。 (?=。[AZ])(?=。 [^ A-Za-z0-9 \ s])(?=。[az])|(?=。 \ d) )(?=(。)(?>。?(?!\ 1})(。))(?>。?(?!\ 1} | \ 2)(。))(?>。? (?!\ 1 | \ 2 | \ 3)(。))(?>。?(?!\ 1 | \ 2 | \ 3 | \ 4)(。))(?>。?(?! (?!。?\ d {4})(?!。?[az] {4})(?!。?[1 | \ 2 | \ 3 | \ 4 | \ 5)。) AZ] {4})(?!。*?[^ A-Za-z0-9 \ s] {4})

希望我們再也不要碰它了)再次我會推代碼選項,我認爲:)

編輯:發現字符串不太正確。它不會傳遞「!tt23yyy」而不必添加其他數字或特殊字符。所以有正則表達式的想法,並與代碼選項。這實在太難調試正則表達式的問題,如果你不理解正則表達式:)(可以理解的)

+1

你想要將太多的東西塞進一個正則表達式中......如果你設法讓所有東西都進入,那麼這對任何人來說都是難以逾越的。是否有一個特定的要求,你*必須*只使用*一個*正則表達式? – rid

+0

它必須在一個通行證?如果您一次完成這項任務,您無法爲用戶提供很多反饋意見。 –

+1

爲什麼使用正則表達式呢?特別是單一的?你不能告訴用戶用戶破壞了你的一個奇怪的要求嗎? –

回答

6

這裏是一個PCRE/Perl的正則表達式,將盡一切:

/ 
^ # anchor it 

# must be at least 8 characters 
(?=.{8,}) 

# must have characters from at least 3 of the 4 different character types 
(?: 
    (?=.*\d)(?=.*[A-Z])(?=.*[a-z]) 
| (?=.*\d)(?=.*[^A-Za-z0-9\s])(?=.*[a-z]) 
| (?=.*[^A-Za-z0-9\s])(?=.*[A-Z])(?=.*[a-z]) 
| (?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9\s]) 
) 

# at least 5 different chars 
(?= 
         (.) 
    (?>.*?(?!\1})  (.)) 
    (?>.*?(?!\1}|\2)  (.)) 
    (?>.*?(?!\1|\2|\3) (.)) 
    (?>.*?(?!\1|\2|\3|\4) .) 
) 

# no long sequence of the same character type (if long is 3) 
(?!.*?\d{3}) 
(?!.*?[a-z]{3}) 
(?!.*?[A-Z]{3}) 
(?!.*?[^A-Za-z0-9\s]{3}) 

/xs 

不是測試,因此能錯過了一些東西。請享用。 ;-)

如果你真的要使用它(在較長的字符串上),你可能想要添加一些(更多)原子分組(?>foo)(或類似的)來防止指數回溯。

+0

感謝您的詳細回覆:) – Jen

+0

也可以在開始時用'^'將其錨定,而那些'\ g {-N}'可以重寫爲相應的'\ N'(如果不支持,我用他們以防萬一有其他捕獲組)。 – Qtax

+0

最後一部分 - 注意到這些似乎沒有拾取多個字母(小寫或大寫) - 但符號和數字都有效。即。這些語句(?!。*?[a-z] {3})(?!。*?[A-Z] {3}) – Jen