thắc mắc complicated Regex pattern confused ? (Validation Password)

khangtictoc

Senior Member
Hola mọi người, mình mới học cơ bản về Regex, lên advanced thì mình có gặp một khái niệm là lookahead. Mình có đọc hiểu cơ bản nhưng cũng không rõ để giải thích một cái regex Validate password ở dưới:
Code:
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$
Cái dấu "^"(start) và "$"(end) ở chỗ này khiến mình khó hiểu khi bình thường bắt đầu bằng một char (Vd: a(?=q)) thì mình clear chỗ này ), và đại khái cái pattern mình cũng không rõ.
Các bác có thể giải thích full cho cho mình cái regex trên được không ạ. Mình tham khảo regex solution của cộng đồng trên https://regexr.com/.
NOTE: Regex thực hiện match:
  • at least 8 characters
  • must contain at least 1 uppercase letter, 1 lowercase letter, and 1 number
  • Can contain special characters
 
https://regex101.com/

Vào trang này, dán cái regex đó vào, nó có phần explanation sẽ giải thích cho bạn.

QdBQkjz.jpg


Gửi từ Galaxy Note 20 Ultra bằng vozFApp
 
lookahead ở đây hiểu là có match nhưng ko consume. nếu lookahead match thì sẽ back lại vị trí cũ và match tiếp, còn không thì fail
Code:
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$
^ và $ -> chắc ae hiểu rồi. tức là toàn bộ input phải match regex này
(?=.*\d) -> lookahead: tìm ký tự số bất kỳ sau khi đã bỏ qua 0-hoặc-nhiều ký tự, và sau khi tìm thấy quay lại ban đầu, không thấy thì fail
(?=.*[a-z]), tương tự như trên nhưng tìm ký tự alphabeta thường
(?=.*[A-Z]) , tương tự như trên nhưng tìm ký tự alphabeta HOA
(?=.*[a-zA-Z]) hơi thừa, tìm ký tự alphabeta, sau khi tìm thấy lại quay về vị trí cũ
=> Lúc này đang ở vị trí không và tất cả các điều kiện trên đã thỏa
.{8,} match 8 ký tự bất kỳ hoặc hơn
 
lookahead ở đây hiểu là có match nhưng ko consume. nếu lookahead match thì sẽ back lại vị trí cũ và match tiếp, còn không thì fail
Code:
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$
^ và $ -> chắc ae hiểu rồi. tức là toàn bộ input phải match regex này
(?=.*\d) -> lookahead: tìm ký tự số bất kỳ sau khi đã bỏ qua 0-hoặc-nhiều ký tự, và sau khi tìm thấy quay lại ban đầu, không thấy thì fail
(?=.*[a-z]), tương tự như trên nhưng tìm ký tự alphabeta thường
(?=.*[A-Z]) , tương tự như trên nhưng tìm ký tự alphabeta HOA
(?=.*[a-zA-Z]) hơi thừa, tìm ký tự alphabeta, sau khi tìm thấy lại quay về vị trí cũ
=> Lúc này đang ở vị trí không và tất cả các điều kiện trên đã thỏa
.{8,} match 8 ký tự bất kỳ hoặc hơn
Tks bác nhiều, câu trả lời hoàn chỉnh quá ⭐⭐⭐⭐⭐
 
Back
Top