簡體   English   中英

正則表達式將強密碼與兩個或多個特殊字符匹配

[英]Regex match a strong password with two or more special characters

我需要使用具有以下要求的javascript匹配密碼字段的正則表達式:

  • 至少15個字符
  • 兩個或多個小寫字母
  • 兩個或多個大寫字母
  • 兩位或更多位數
  • 兩個或多個以下特殊字符:!@#$%^&* -

我有一個正則表達式來處理大多數情況:

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

這里的問題是符號,它適用於:

 P@ssw0rdP@ssw0rd Pssw0rdPssw0rd@@ Pssw0rd@@Pssw0rd 

但不是:

 @@Pssw0rdPssw0rd 

我有一個隨機密碼生成器設置詳盡測試這個,所以任何想法都非常感謝。 謝謝!

/^(?=(?:.*[a-z]){2})(?=(?:.*[A-Z]){2})(?=(?:.*\d){2})(?=(?:.*[!@#$%^&*-]){2}).{15,}$/

你的前瞻是錯誤的。 模式

(?=.{2,}[class])

表示匹配2個或更多字符(無論是什么字符),然后是所需類的1個字符。 這與您指定的“所需類別的2個或更多字符”完全不同。

要正確測試文本中是否包含所需類的字符,請使用

(?=.*[class])

並且由於您要檢查兩次,請重復該模式

(?=.*[class].*[class])
# equivalent to (?=(?:.*[class]){2})

我不確定單個正則表達式是進行此測試的方法。

我個人會實現這樣的事情:(視為偽代碼,我還沒有測試過)

function testPassword(pw) {
    var len = pw.length;
    if(len < 15) return false;
    if(pw.replace(/[a-z]/,'').length > len - 2) return false;
    if(pw.replace(/[A-Z]/,'').length > len - 2) return false;
    if(pw.replace(/[0-9]/,'').length > len - 2) return false;
    if(pw.replace(/[!@#$%^&*-]/,'').length > len - 2) return false;
    return true;
}

已經有一些很好的解釋,所以我只是在努力......

/^
(?= .{15} )
(?= (?:.*[[:lower:]]){2} )
(?= (?:.*[[:upper:]]){2} )
(?= (?:.*[[:digit:]]){2} )
(?= (?:.*[!@#$%^&*-]){2} )
/x

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM