Ví dụ mật khẩu 8 ký tự

Biểu thức chính quy mà bạn đang theo đuổi rất có thể sẽ rất lớn và là cơn ác mộng cần duy trì đặc biệt đối với những người không quen thuộc với các biểu thức thông thường.

Tôi nghĩ rằng sẽ dễ dàng hơn để phá vỡ regex của bạn và làm điều đó từng chút một. Nó có thể mất thêm một chút để làm, nhưng tôi khá chắc chắn rằng việc duy trì và gỡ lỗi nó sẽ dễ dàng hơn. Điều này cũng sẽ cho phép bạn cung cấp nhiều thông báo lỗi được định hướng hơn cho người dùng của mình [ngoài Invalid Password] để cải thiện trải nghiệm người dùng.

Từ những gì tôi thấy bạn khá thông thạo regex, vì vậy tôi cho rằng việc cho bạn các biểu thức chính quy để làm những gì bạn cần sẽ là vô ích.

Xem bình luận của bạn, đây là cách tôi sẽ đi về nó:

  • Phải dài tám ký tự: Bạn không cần regex cho việc này. Sử dụng thuộc tính .Length là đủ.
  • Bao gồm một chữ cái viết hoa: Bạn có thể sử dụng biểu thức chính quy [A-Z]+. Nếu chuỗi chứa ít nhất một chữ cái viết hoa, biểu thức chính quy này sẽ mang lại true.
  • Một ký tự đặc biệt: Bạn có thể sử dụng \W sẽ khớp với bất kỳ ký tự nào không phải là chữ cái hoặc số hoặc người nào khác, bạn có thể sử dụng một cái gì đó giống như vậy [[email protected]#] để chỉ định danh sách tùy chỉnh các ký tự đặc biệt. Lưu ý rằng các ký tự như $, ^, [ và ] là các ký tự đặc biệt trong ngôn ngữ biểu thức chính quy, vì vậy chúng cần được thoát như vậy: \$. Vì vậy, trong ngắn hạn, bạn có thể sử dụng \W.
  • Các ký tự chữ và số: Sử dụng \w+ phải khớp với bất kỳ chữ cái và số nào và gạch dưới.

Hãy xem này hướng dẫn để biết thêm thông tin.

[                   # Start of group [?=.*\d]        #   must contain at least one digit [?=.*[A-Z]]     #   must contain at least one uppercase character [?=.*\W]        #   must contain at least one special symbol .            #     match anything with previous condition checking {8,8}      #        length is exactly 8 characters ]                   # End of group

Trong một dòng:[[?=.*\d][?=.*[A-Z]][?=.*\W].{8,8}]

Nguồn:

  • Biểu thức khớp mật khẩu
  • Xác thực cường độ mật khẩu với các biểu thức thông thường

Rất nhiều câu trả lời .... tất cả đều xấu!

Các biểu thức thông thường không có toán tử AND, vì vậy thật khó để viết một biểu thức chính phù hợp với mật khẩu hợp lệ, khi tính hợp lệ được xác định bởi một cái gì đó VÀ một cái gì khác VÀ một cái gì khác ...

Nhưng, các biểu thức chính quy do có toán tử OR, vì vậy chỉ cần áp dụng định lý DeMorgan và viết một biểu thức chính phù hợp với mật khẩu không hợp lệ.

bất cứ thứ gì có ít hơn 8 ký tựHOẶCbất cứ thứ gì không có sốHOẶCbất cứ thứ gì không có chữ hoaHOẶCbất cứ thứ gì không có ký tự đặc biệt

Vì thế:^[.{0,7}|[^0-9]*|[^A-Z]*|[a-zA-Z0-9]*]$

Nếu bất cứ điều gì phù hợp với điều đó, thì đó là mật khẩu không hợp lệ.

Như một ví dụ làm thế nào điều này có thể được thực hiện với một regex có thể đọc/duy trì được.

Đối với regex dài hơn, bạn phải luôn sử dụng RegexOptions.IgnorePatternWhitespace để cho phép khoảng trắng và nhận xét trong biểu thức để dễ đọc hơn.String[] passwords = { "foobar", "Foobar", "Foobar1", "Fooobar12" }; foreach [String s in passwords] { Match password = Regex.Match[s, @" ^              # Match the start of the string [?=.*\p{Lu}]  # Positive lookahead assertion, is true when there is an uppercase letter [?=.*\P{L}]   # Positive lookahead assertion, is true when there is a non-letter \S{8,}        # At least 8 non whitespace characters $              # Match the end of the string ", RegexOptions.IgnorePatternWhitespace]; if [password.Success] { Console.WriteLine[s + ": valid"]; } else { Console.WriteLine[s + ": invalid"]; } } Console.ReadLine[];

Câu trả lời là không sử dụng biểu thức chính quy. Đây là bộ và đếm.

Biểu thức thông thường là về thứ tự.

Trong cuộc sống của bạn là một lập trình viên, bạn sẽ yêu cầu làm nhiều việc không có ý nghĩa. Học để đào một cấp độ sâu hơn. Tìm hiểu khi câu hỏi sai.

Câu hỏi [nếu nó đề cập đến các biểu thức chính quy] là sai.

Mã giả [đã chuyển đổi giữa quá nhiều ngôn ngữ, trễ]:if s.length < 8: return False nUpper = nLower = nAlphanum = nSpecial = 0 for c in s: if isUpper[c]: nUpper++ if isLower[c]: nLower++ if isAlphanumeric[c]: nAlphanum++ if isSpecial[c]: nSpecial++ return [0 < nUpper] and [0 < nAlphanum] and [0 < nSpecial]

Đặt cược bạn đã đọc và hiểu mã trên gần như ngay lập tức. Đặt cược bạn mất nhiều thời gian hơn với regex, và ít chắc chắn hơn là đúng. Mở rộng regex là rủi ro. Mở rộng ngay lập tức ở trên, ít hơn nhiều như vậy.

Cũng lưu ý rằng câu hỏi không đúng giai đoạn. Bộ ký tự ASCII hay Unicode, hay ?? Tôi đoán từ khi đọc câu hỏi là ít nhất một ký tự chữ thường được giả sử. Vì vậy, tôi nghĩ rằng quy tắc cuối cùng được giả định nên là:return [0 < nUpper] and [0 < nLower] and [0 < nAlphanum] and [0 < nSpecial]

[Thay đổi mũ thành tập trung vào bảo mật, đây là quy tắc thực sự gây phiền nhiễu/không hữu ích.]

Học cách biết khi câu hỏi sai là ồ ạt quan trọng hơn câu trả lời thông minh. Một câu trả lời thông minh cho câu hỏi sai gần như luôn luôn sai.

Nếu bạn chỉ cần một chữ hoa và ký tự đặc biệt thì nó sẽ hoạt động:@"^[?=.{8,}$][?=[^A-Z]*[A-Z][^A-Z]*$]\w*\W\w*$"

Biểu thức chính quy mà bạn đang tìm kiếm là: /^[?=.*[a-z]][?=.*[A-Z]][?=.*[0-9]][?=.*[[email protected]#\$%\^&\*\[\]"\';:_\-\., =\+\/\\]].{8,}$/u.

Ví dụ và kiểm tra: //regexr.com/3fhr4

Bạn có thể sử dụng lớp dưới đây để xác nhận:public class PasswordValidator{ private Pattern pattern; private Matcher matcher; private static final String PASSWORD_PATTERN = "[[?=.*\\d][?=.*[a-z]][?=.*[A-Z]][?=.*[@#$%]].{6,20}]"; public PasswordValidator[]{ pattern = Pattern.compile[PASSWORD_PATTERN]; } /** * Validate password with regular expression * @param password password for validation * @return true valid password, false invalid password */ public boolean validate[final String password]{ matcher = pattern.matcher[password]; return matcher.matches[]; } }

trong đó 6 và 20 là độ dài tối thiểu và tối đa cho mật khẩu.

Câu hỏi này bắt đầu được lan truyền và rất nhiều gợi ý thú vị xuất hiện.

Vâng, viết bằng tay rất khó. Vì vậy, một giải pháp dễ dàng hơn là sử dụng một mẫu. Mặc dù regex kết quả có thể không tối ưu nhất, nhưng việc duy trì và/hoặc thay đổi sẽ dễ dàng hơn và người dùng sẽ kiểm soát kết quả tốt hơn. Có thể là tôi đã bỏ lỡ điều gì đó, vì vậy bất kỳ lời chỉ trích mang tính xây dựng nào cũng sẽ hữu ích.

Liên kết này có thể thú vị: khớp ít nhất 2 chữ số 2 chữ cái theo bất kỳ thứ tự nào trong chuỗi , Ngôn ngữ biểu thức chính quy , Nhóm bắt

Tôi đang sử dụng mẫu này [?=[?:.*?[{type}]]{[{count}]}] dựa trên tất cả các biểu thức chính mà tôi đã thấy trong SO. Bước tiếp theo là thay thế mẫu cần thiết [number, special character ...] và thêm cấu hình cho chiều dài.

Tôi đã tạo một lớp nhỏ để soạn regex PasswordRegexGenerator.cs Một ví dụ:string result = new PasswordRegexGenerator [ ] .UpperCase [ 3, -1 ]    // ... {3,} .Number [ 2, 4 ]        // ... {2,4} .SpecialCharacter [ 2 ] // ... {2} .Total [ 8,-1 ] .Compose [ ]; /// /// Generator for regular expression, validating password requirements. /// public class PasswordRegexGenerator { private string _elementTemplate = "[?=[?:.*?[{type}]]{[{count}]}]"; private Dictionary _elements = new Dictionary { { "uppercase", "[A-Z]" }, { "lowercase", "[a-z]" }, { "number", @"\d" }, { "special", @"\W" }, { "alphanumeric", @"\w" } }; private StringBuilder _sb = new StringBuilder [ ]; private string Construct [ string what, int min, int max ] { StringBuilder sb = new StringBuilder [ _elementTemplate ]; string count = min.ToString [ ]; if [ max == -1 ] { count += ","; } else if [ max > 0 ] { count += "," + max.ToString[]; } return sb .Replace [ "[{type}]", what ] .Replace [ "[{count}]", count ] .ToString [ ]; } /// /// Change the template for the generation of the regex parts /// /// the new template /// public PasswordRegexGenerator ChangeRegexTemplate [ string newTemplate ] { _elementTemplate = newTemplate; return this; } /// /// Change or update the regex for a certain type [ number, uppercase ... ] /// /// type of the regex /// new value for the regex /// public PasswordRegexGenerator ChangeRegexElements [ string name, string regex ] { if [ _elements.ContainsKey [ name ] ] { _elements[ name ] = regex; } else { _elements.Add [ name, regex ]; } return this; } #region construction methods /// /// Adding number requirement /// /// /// /// public PasswordRegexGenerator Number [ int min = 1, int max = 0 ] { _sb.Append [ Construct [ _elements[ "number" ], min, max ] ]; return this; } public PasswordRegexGenerator UpperCase [ int min = 1, int max = 0 ] { _sb.Append [ Construct [ _elements[ "uppercase" ], min, max ] ]; return this; } public PasswordRegexGenerator LowerCase [ int min = 1, int max = 0 ] { _sb.Append [ Construct [ _elements[ "lowercase" ], min, max ] ]; return this; } public PasswordRegexGenerator SpecialCharacter [ int min = 1, int max = 0 ] { _sb.Append [ Construct [ _elements[ "special" ], min, max ] ]; return this; } public PasswordRegexGenerator Total [ int min, int max = 0 ] { string count = min.ToString [ ] + [ [ max == 0 ] ? "" : "," + max.ToString [ ] ]; _sb.Append [ ".{" + count + "}" ]; return this; } #endregion public string Compose [] { return "[" + _sb.ToString [ ] + "]"; } }

Chủ Đề