2014-01-27 55 views
0

以一個javascript類爲例,其中有很多代碼示例,但沒有提供任何解釋。我想到我對各種運營商和標準功能有了很好的理解,但下面的else if聲明對我來說簡直令人難以置信。有人可以請一點點光,謝謝。逆向工程JavaScript正則表達式

function validatePassword(password) { 
try { 
    if (document.forms[0].password.value != document.forms[0].password_confirm.value) 
    throw "You did not enter the same password."; 
    else if (!/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,15}$/.test(password)) 
    throw "You did not enter a valid password."; 
} 

具體地說此: (!/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,15}$/.test(password))

+0

看[正則表達式MDN(https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions) – Givi

+0

'(!/ ^(?=。* \ d)( ?=。* [az])(?=。* [AZ])。{6,15} $ /。test(password))'是一個正則表達式(http://en.wikipedia.org/wiki/Regular_expression) 。密碼需要匹配一系列過濾器才能被接受。 –

+0

各種字符是一個正則表達式,'test()'測試密碼是否與正則表達式字符串匹配。 – Chris

回答

2

打破

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

/.../.test(password)正在檢查的password字符串值是否regular expression向左匹配。

.{6,15}要求password的長度在6到15個UTF-16代碼單元之間,並且只包含非換行符。

(?=.*\d)是一個lookahead只有當字符串中有一個數字時才匹配。 .*\d意味着任何行字符(.)的0或更多(*)後跟數字\d

(?=.*[a-z])(?=.*[A-Z])同樣需要至少一個小寫ASCII字母和一個大寫字母。

2

這是一個正則表達式(正則表達式)。字符的字符:

  • (打開paren,這裏沒什麼棘手。
  • !「不」運算符,否定接下來的內容。
  • /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,15}$/大討厭的正則表達式。進一步打破這一部分(忽略斜槓,因爲他們只是分隔符):

    • ^必須與給定的字符串的開始。
    • (?=.*\d) lookahead;檢查零個或多個字符,然後檢查一個數字。基本上,確保密碼至少有一位數字。
    • (?=.*[a-z])另一個向前看;檢查零個或多個字符,然後檢查小寫字母,確保密碼至少包含一個小寫字母。
    • (?=.*[A-Z])第三個向前看;這個確保密碼至少包含一個大寫字母。
    • .{6,15}$匹配6到15次之間的任何字符,然後匹配字符串的結尾。由於我們自開始播放主播(^)以來所做的所有事情都是向前看的,因此沒有任何字符實際上已被消費。如果我們不需要確認上/下/數位,我們可以寫^.{6,15}$,它可以匹配長度在6到15個字符之間的任何字符串(包括)。
  • .test(password)以前的混亂創建的RegExp對象。現在我們調用test()方法,傳入我們的密碼。如果正則表達式匹配(即密碼符合我們的要求),則返回true,如果密碼失敗,則返回false
  • ) Close paren。簡單但重要。