2013-03-01 44 views
6

Có ai có thể giúp tôi với một mật khẩu cho một mật khẩu với những điều sau đây vui lòng không.Biểu thức Reg yêu cầu cho mật khẩu mạnh

bao gồm ít nhất hai trong các cách sau:

một chữ cái thường
thư vốn
một số
một 'nhân vật đặc biệt' (ví dụ £, $, &, #)

+0

* ít nhất hai trong các cách sau * .. có nghĩa là mật khẩu có hai chữ cái thường và hai chữ cái viết hoa là hợp lệ (không có số, v.v.) là hợp lệ? –

+0

Xem [tại đây] (http://stackoverflow.com/questions/2394092/regex-for-strong-password?rq=1) hoặc [tại đây] (http://stackoverflow.com/questions/1254952/regular-expression -cho-mật khẩu? rq = 1) hoặc thậm chí có thể [ở đây] (http://stackoverflow.com/questions/2370015/regular-expression-for-password-validation?rq=1). –

+0

Xin lỗi, mật khẩu phải chứa 2 trong số 4 nhóm ký tự, nghĩa là một chữ thường và một số hoặc một chữ cái viết hoa và một số vv –

Trả lời

1

Như Keith Thompson đã nói trong một nhận xét, tôi không nghĩ rằng một regex đơn có giá trị ở đây.

Đoạn mã dưới đây sẽ làm những gì bạn muốn, và tôi nghĩ rằng đó là dễ đọc hơn, dễ bảo trì và dễ dàng hơn để chứng minh sự đúng đắn hơn là một biểu thức chính quy duy nhất:

string password = "123abc"; 
string[] regexes = new[] 
    { 
     "[a-z]", //any lowercase word 
     "[A-Z]", //any uppercase word 
     @"\d", //any digit 
     @"\W" //special characters (or just [£$&#], adding the characters you want) 
    }; 
bool isValid = regexes.Count(regex => Regex.IsMatch(password, regex)) >= 2; 
+0

Cảm ơn tất cả mọi người, tôi đã tạo ra một xác nhận hợp lệ và sử dụng gợi ý của Oscar. –

4

Các sau đây sẽ hoạt động:

^(?![a-z]*$|[A-Z]*$|\d*$|[\W_]*$).*$ 

Ví dụ: http://www.rubular.com/r/effCmvehdx

Dấu nhìn tiêu cực ngay từ đầu sẽ khiến điều này thất bại nếu toàn bộ chuỗi được tạo thành hoàn toàn chỉ là một nhóm.

Lưu ý rằng mặc dù điều này phù hợp với yêu cầu của bạn, nhưng đây không phải là một regex rất tốt cho mật khẩu mạnh. Bạn cũng có thể muốn kiểm tra độ dài và bạn có thể muốn yêu cầu ít nhất ba trong số các nhóm đó thay vì hai nhóm.

+0

hmm .. Tôi có thiếu gì đó ở đây không? * bao gồm ít nhất hai trong số những điều sau đây * ... có nghĩa là 'abcABC' hoặc' abc123' phải hợp lệ. –

+0

@OscarMederos: Vâng, đúng vậy. Vấn đề ở đâu? –

+0

Tôi xin lỗi. Tôi đã thử nghiệm với Rad Software Regular Expression Designer và nó không phù hợp. Tôi đã thử nghiệm nó với C# và làm việc. Bạn có thể chỉnh sửa câu hỏi của mình để tôi có thể xóa bỏ phiếu giảm giá của mình không? –

1

Như tôi đã nói trong một nhận xét, một regex gần như chắc chắn không phải là công cụ thích hợp cho công việc này. Sẽ dễ dàng hơn khi viết một số mã lặp lại các ký tự của mật khẩu, đếm số ký tự trong mỗi lớp.

Bạn chưa xác định "ký tự đặc biệt" là gì. Tôi sẽ giả định rằng nó có nghĩa là bất kỳ ký tự nào khác ngoài một chữ cái hoặc chữ số (bao gồm dấu cách và ký tự điều khiển). Tôi cũng giả định rằng "chữ" chỉ đề cập đến 26 chữ cái trong bảng chữ cái tiếng Anh - có nghĩa là một chữ cái không phải tiếng Anh như ñ là một ký tự đặc biệt.

Để lấy ví dụ đơn giản hơn, các regex không thể hiện rõ những thứ như "foo và bar theo thứ tự"; bạn phải chỉ định cả hai đơn hàng một cách rõ ràng:

foo.*bar|bar.*foo 

Trong trường hợp này, bạn cần 12 lựa chọn khác nhau. Tôi nghĩ rằng điều này là chính xác, nhưng tôi chưa thử nghiệm nó.

[a-z].*[A-Z}|[A-Z].*[a-z}|[a-z].*[0-9]|[0-9].*[a-z]|[a-z].*[^a-zA-Z0-9]|[^a-zA-Z0-9].*[a-z]|[A-Z].*[0-9]|[0-9].*[A-Z]|[A-Z].*[^a-zA-Z0-9]|[^a-zA-Z0-9].*[A-Z]|[0-9].*[^a-zA-Z0-9]|[^a-zA-Z0-9].*[0-9] 

Đây là kiểu regex hoặc phong cách Perl. grep không nhận dạng được | theo mặc định; nếu bạn cần một regexp grep kiểu, hãy thay thế mỗi | theo \|.

Và nếu yêu cầu thay đổi, hãy yêu cầu ít nhất 3 trong số 5 lớp ký tự, bạn sẽ cần phải viết lại hoàn toàn regex; bạn không thể chỉnh sửa nó.

Lưu ý rằng các yêu cầu của bạn vẫn cho phép Aa.

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