2012-11-28 144 views
1

我想正則表達式爲密碼驗證密碼驗證的正則表達式

^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).{6,}$ 

它限制了至少1位,1個上1小寫字母,不是嗎?
那麼爲什麼以下結果爲true

(new RegExp('^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).{6,}$')).test('aaAAffffaAfDvad') 

但是下一個false

(new RegExp('^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).{6,}$')).test('aaAA112') 
+7

請不要限制最大長度。 – zerkms

+4

沒有真正的原因溝數/案件要求和最大長度要求。他們不工作,從未工作。另請參閱http://xkcd.com/936/ – Deestan

+0

您可以在此[網站](http://www.myregextester.com/index.php)上查找您的RegEx。永遠不知道,你可能會發現一些有趣的... –

回答

1
在JS控制檯

(螢火蟲或其他)試試這個:

var re = /^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).{6,20}$/ 

那麼這個:

var re2 = new RegExp('^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).{6,20}$') 

那麼你只要檢查結果......你會看到,在re2中,\d未針對正則表達式正確轉義,但爲字符串轉義。

編輯: 發現Javascript: RegExp not working no matter what my expression is

1

這是因爲\\d不正確轉義:

>>> var x = new RegExp('^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).{6,20}$'); 
>>> x 
/^(?=.*d)(?=.*[A-Z])(?=.*[a-z]).{6,20}$/ 

>>> var x = new RegExp('^(?=.*\\d)(?=.*[A-Z])(?=.*[a-z]).{6,20}$'); 
>>> x 
/^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).{6,20}$/ 

您還可以利用此功能進行適當的正則表達式轉義:

RegExp.escape = function(s) { 
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&"); 
}; 
var x = new RegExp(RegExp.escape('^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).{6,20}$')); 
1

可能不是實現它的最有效的方式,而是相當可擴展的。

requirements = [ /\d/, /[A-Z]/, /[a-z]/, /^.{6,20}$/ ]; 

function passwordValid(password) { 
    var i = requirements.length; 

    while(i--) { 
     if(!requirements[i].test(password)) return false; 
    } 
    return true; 
}