2011-01-12 51 views
10

tôi cần phải regex phù hợp với một trường mật khẩu sử dụng javascript với các yêu cầu sau:Regex phù hợp với một mật khẩu mạnh với hai hoặc nhiều ký tự đặc biệt

  • Ít nhất 15 ký tự
  • hai hoặc chữ thường hơn chữ
  • !
  • hai hay nhiều chữ hoa chữ
  • hai hoặc nhiều chữ số
  • hai hoặc nhiều hơn các ký tự đặc biệt sau đây: @ # $%^* & -

Tôi có một regex mà sẽ chăm sóc các trường hợp MOST:

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

Vấn đề ở đây là với những biểu tượng, nó hoạt động với:

[email protected]@ssw0rd 
[email protected]@ 
[email protected]@Pssw0rd 

Nhưng không:

@@Pssw0rdPssw0rd 

Tôi có trình tạo mật khẩu ngẫu nhiên được thiết lập để kiểm tra đầy đủ điều này, vì vậy mọi ý tưởng đều được đánh giá cao. Cảm ơn!

+0

Tôi nghĩ rằng đây không thể được thực hiện với một * * regex. –

+0

@Salman: tại sao không? Bao giờ nghe nói về lookaheads? –

+4

Tôi khuyên bạn không nên làm điều này. Bảo mật mật khẩu bắt buộc là một trong những lý do chính khiến người dùng tạo "password1" hoặc "PAssword! @ 12345" trong trường hợp của bạn. – yorick

Trả lời

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

lookaheads của bạn là sai. Mẫu

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

có nghĩa là khớp 2 hoặc nhiều ký tự (bất kể ký tự nào), sau đó theo sau là 1 ký tự của lớp mong muốn. Điều này hoàn toàn khác với "2 hoặc nhiều ký tự của lớp mong muốn" mà bạn đã chỉ định.

Để kiểm tra một cách chính xác nếu một nhân vật của lớp mong muốn là trong văn bản, sử dụng

(?=.*[class]) 

và kể từ khi bạn muốn kiểm tra xem nó hai lần, lặp lại các mô hình

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

Đã kiểm tra và xác nhận với 100.000 mật khẩu được tạo ngẫu nhiên. Bạn thưa ngài là một jedi regex, cảm ơn! – rwyland

+0

Muốn thêm rằng regex này hoạt động đa nền tảng, nhưng nếu bạn sử dụng nó trong javascript nó sẽ KHÔNG làm việc trong IE7 vì vấn đề lookahead trong công cụ javascript. [link] (http://stackoverflow.com/questions/3999733/ie7-regex-issue-regex-that-work-in-every-browser-does-not-work-in-ie7) – rwyland

+0

Tại sao họ không cho phép bạn xóa bình luận ?? – Joe

3

Tôi không chắc chắn một regexp đơn là cách để thực hiện bài kiểm tra này.

Cá nhân tôi muốn thực hiện nó một cái gì đó như thế này: (điều trị như mã giả, tôi đã không kiểm tra nó)

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(/[[email protected]#$%^&*-]/,'').length > len - 2) return false; 
    return true; 
} 
+0

pw.replace (/ [a-z]/** g **, '') .... – kennytm

+0

Vâng tôi cũng có một thứ như thế này. +1 – Anders

+0

Tôi thích suy nghĩ của bạn, nhưng tôi cần regex vì nó hoạt động trên nhiều ngôn ngữ, vì vậy việc sử dụng lại mã dễ dàng hơn rất quan trọng đối với tôi. – rwyland

0

Có một số lời giải thích tốt rồi, vì vậy tôi chỉ chồng chất trên .. .

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

Các vấn đề liên quan