2011-07-18 128 views
6

我打算寫一個正則表達式如果字符串包含至少n個不同類別的字符,將只匹配的至少n。我打算用這個強迫我的用戶創建高強度密碼,並要檢查,如果密碼包含以下至少3:正則表達式匹配M組

  • 人物
  • 資本人物
  • 特殊字符

如果所有這些類都存在,編寫一個匹配的正則表達式就很容易使用lookaheads。但是,我無法將自己的頭圍繞「至少3個」部分。這甚至有可能(以一個很好的,緊湊的表達),還是我必須創建一個怪物表達式?

回答

6

我認爲這會比列出4中3個的每個可能組合更緊湊。它使用負向前視來確保整個字符串不僅包含您列出的字符類中的一個或兩個:

(?!([a-zA-Z]*|[a-z\d]*|[^A-Z\d]*|[A-Z\d]*|[^a-z\d]*|[^a-zA-Z]*)$).* 

爲了,這裏的組是:

  • 下部和/或上部
  • 下和/或數字
  • 下和/ O ř特殊
  • 上和/或數字
  • 上部和/或特殊
  • 數字和/或特殊

此正則表達式將失敗,如果整個字符串(因爲在負先行的$)只包含來自上述任何組的字符。

+1

我非常喜歡這種方法。甚至沒有考慮顛倒邏輯。非常感謝,非常聰明! –

+1

這個表達式是否允許空格? – Rookian

+1

它的確如此,[密碼允許空格並不少見](http://stackoverflow.com/questions/632167/should-users-be-allowed-to-entered-a-password-with-a-space-在最開始,或-E)。如果你需要一個不允許有空格的版本,把'。*'結尾改爲'\ S *'。 –

2

你必須寫對的4 3每個可能的組合(四個表達式總共)的表達式,然後|單獨表達在一起,以便它們在滿足至少一個原始表達式時通過。

+1

這是4個表達式每次約3/4當前的正則表達式的長度,所以你的最終結果將是約3×當前的正則表達式的大小。不錯。 – Paulpro

+0

我希望我不必這樣做。我認爲它並不乾淨,特別是因爲我將不得不一遍又一遍地重寫相同的類。謝謝你的澄清。 –

+0

爲什麼不乾淨?創建一個方法來完成它並重新使用它。這比擁有一個巨大的不可讀的RegEx好多了。 –

0

你怎麼看待這個解決方案是什麼?

var str='23khkS_s'; 

var countGroups=0; 
if(str.match(/[a-z]+/)) 
    countGroups++; 
if(str.match(/[A-Z]+/)) 
    countGroups++; 
if(str.match(/[0-9]+/)) 
    countGroups++; 
if(str.match(/[[email protected]#$%*\(\)]+/)) 
    countGroups++; 

console.log(countGroups); 

代替使用1怪物狀表達的可以使用4小RE。然後與變量countGroups一起工作,其中包含一些變化的字符組。 我希望這是有益的

+0

如果他總是控制整個解決方案,這會很好,但我懷疑他所能做的只是將正則表達式放入文本字​​段中進行配置。 –