2010-08-12 26 views
30

tôi có các tiêu chí sau để tạo một biểu thức chính quy cho một mật khẩu mà phù hợp với các quy tắc sau:biểu hiện thường xuyên để thực thi mật khẩu phức tạp, phù hợp với 3 trong số 4 quy tắc

  1. Mật khẩu phải dài 8 ký tự (điều này tôi có thể làm :-)).

Mật khẩu sau đó phải chứa các ký tự từ ít nhất 3 trong 4 quy tắc sau:

  1. trường hợp Upper
  2. thấp hơn trường hợp
  3. số
  4. Non-alpha số

Tôi có thể làm cho biểu thức khớp với TẤT CẢ các quy tắc đó với biểu thức sau:

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

Nhưng tôi đang vật lộn với cách thực hiện điều này theo cách mà chỉ cần giải quyết bất kỳ 3 trong 4 quy tắc nào.

bất cứ ai có thể giúp tôi ra với điều này?

+7

tôi phải nói rằng đây là một trong những trường hợp khi tôi nghĩ rằng mã của bạn có lẽ sẽ nhiều dễ đọc hơn nếu bạn có 4 regex khác nhau thay thế. Và sau đó có thể có một số và cho mỗi regex phù hợp với bạn tăng số lượng và sau đó vào cuối bạn chỉ cần kiểm tra nếu số là 3 hoặc cao hơn. –

+0

Bạn đang sử dụng ngôn ngữ lập trình nào? – kennytm

Trả lời

73

Không sử dụng một regex để kiểm tra xem nó sau đó.

if (password.length < 8) 
    alert("bad password"); 
var hasUpperCase = /[A-Z]/.test(password); 
var hasLowerCase = /[a-z]/.test(password); 
var hasNumbers = /\d/.test(password); 
var hasNonalphas = /\W/.test(password); 
if (hasUpperCase + hasLowerCase + hasNumbers + hasNonalphas < 3) 
    alert("bad password"); 

Nếu bạn phải sử dụng một regex duy nhất:

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

regex này không được tối ưu hóa cho hiệu quả. Nó được xây dựng bởi A·B·C + A·B·D + A·C·D + B·C·D với một số yếu tố. Breakdown:

^ 
(?: 
    (?=.*[a-z])  # 1. there is a lower-case letter ahead, 
    (?:    # and 
     (?=.*[A-Z]) #  1.a.i) there is also an upper-case letter, and 
     (?=.*[\d\W]) #  1.a.ii) a number (\d) or symbol (\W), 
    |     # or 
     (?=.*\W)  #  1.b.i) there is a symbol, and 
     (?=.*\d)  #  1.b.ii) a number ahead 
    ) 
|      # OR 
    (?=.*\W)   # 2.a) there is a symbol, and 
    (?=.*[A-Z])  # 2.b) an upper-case letter, and 
    (?=.*\d)   # 2.c) a number ahead. 
) 
.{8,}     # the password must be at least 8 characters long. 
$ 
5

Bạn thể viết một regex thực sự tinh vi để làm điều đó. Thay vào đó, tôi đề nghị viết bốn regex riêng biệt, một cho mỗi quy tắc và kiểm tra từng quy tắc một, đếm số lượng chúng phù hợp. Nếu ba trong số bốn người đã làm, hãy chấp nhận mật khẩu.

Id
1

đề nghị làm kiểm tra riêng rẽ, và sau đó chỉ cần tổng cộng lên bao nhiêu trận đấu.

(Tôi cũng không sử dụng một regex trong bất kỳ trong số họ, nhưng thats chỉ POV cá nhân của tôi - mà cụ thể là họ cản trở khả năng đọc và thường được ghi một lần code)

3

Bạn có thể sử dụng Regex sau:

(^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$)?(^(?=.*\d)(?=.*[a-z])(?=.*[@#$%^&+=]).*$)?(^(?=.*\d)(?=.*[A-Z])(?=.*[@#$%^&+=]).*$)?(^(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$)? 

với chiều dài mật khẩu tối thiểu là 8 và chiều dài tối đa 32 bạn có thể sử dụng Regex sau:

(^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,32}$)?(^(?=.*\d)(?=.*[a-z])(?=.*[@#$%^&+=]).{8,32}$)?(^(?=.*\d)(?=.*[A-Z])(?=.*[@#$%^&+=]).{8,32}$)?(^(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).{8,32}$)? 
+0

Trong số bốn bạn cần phải thực hiện 3 lần và nếu có bất kỳ kết quả nào phù hợp với mẫu mật khẩu sẽ được xác thực. – ajithparamban

+3

Tại sao đặt độ dài mật khẩu tối đa? – evolutionxbox

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