Biểu thức chính quy hay còn gọi là Regex là các biểu thức xác định mẫu tìm kiếm. Chúng được sử dụng rộng rãi cho mục đích validation, như xác thực email, xác thực url, xác thực số điện thoại, v.v.
Cấu trúc Regex:
Một regex được viết giữa hai dấu phân cách (/
). Các dấu phân cách này chỉ cần thiết cho các công cụ Regex nhất định (JS, PHP ..). Sau đó, theo sau là 2 cờ:
i
: Ignore case Flag, bỏ qua trường hợp (chữ hoa/chữ thường) của chuỗi đầu vàog
: Global Flag, tìm kiếm nhiều matches thay vì dừng lại ở match đầu tiên
/* Regex Example */
/hello/ig
/* will match the word "hello" irrespective of its case and
will return all found matches. */
Bảng cheat sheet nhanh cho những bạn không nhớ tất cả các quy tắc của Regex
Các Regex thường được sử dụng
1. Chữ số
- Số nguyên -
/^\d+$/
- Số thập phân -
/^\d*\.\d+$/
- Số nguyên + số thập phân -
/^\d*(\.\d+)?$/
- Số âm, số nguyên dương + số thập phân -
/^-?\d*(\.\d+)?$/
- Số nguyên + số thập phân + phân số -
/[-]?[0-9]+[,.]?[0-9]*([\/][0-9]+[,.]?[0-9]*)*/
2. Ký tự chữ và số
- Chữ và số không có dấu cách -
/^[a-zA-Z0-9]*$/
- Chữ và số có dấu cách -
/^[a-zA-Z0-9 ]*$/
3. Email
- Địa chỉ email phổ biến -
/^([a-zA-Z0-9._%-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})*$/
- Địa chỉ email không phổ biến -
/^([a-z0-9_\.\+-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/
4. Độ mạnh mật khẩu
- Phức tạp : Nên có 1 chữ cái viết thường, 1 chữ cái viết hoa, 1 số, 1 ký tự đặc biệt và dài ít nhất 8 ký tự
/(?=(.*[0-9]))(?=.*[\[email protected]#$%^&*()\\[\]{}\-_+=~`|:;"'<>,./?])(?=.*[a-z])(?=(.*[A-Z]))(?=(.*)).{8,}/
- Trung bình : Nên có 1 chữ cái viết thường, 1 chữ cái viết hoa, 1 số và dài ít nhất 8 ký tự
/(?=(.*[0-9]))((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.{8,}$/
5. Tên người dùng
- Chuỗi chữ và số có thể bao gồm _ và - có độ dài từ 3 đến 16 ký tự -
/^[a-z0-9_-]{3,16}$/
6. URL
- Bao gồm giao thức http(s)
/https?:\/\/(www\.)?[[email protected]:%._\+~#=]{2,256}\.[a-z]{2,6}\b([[email protected]:%_\+.~#()?&//=]*)/
- Giao thức tùy chọn
/(https?:\/\/)?(www\.)?[[email protected]:%._\+~#=]{2,256}\.[a-z]{2,6}\b([[email protected]:%_\+.~#?&//=]*)/
7. Địa chỉ IP
- Địa chỉ IPv4
- Địa chỉ IPv6
- Cả địa chỉ IPv4, IPv6
/* Match IPv4 address */
/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/
/* Match IPv6 address */
/(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/
/* Match both IPv4, IPv6 addresses */
/((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$))/
8. Ngày
- Định dạng ngày YYYY-MM-dd với dấu phân cách
-
- Định dạng ngày dd-MM-YYYY với dấu phân cách
-
hoặc.
hoặc/
- Định dạng ngày dd-mmm-YYYY với dấu phân cách
-
hoặc.
hoặc/
/* Date Format YYYY-MM-dd */
/([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))/
/* Date Format dd-MM-YYYY or
dd.MM.YYYY or
dd/MM/YYYY
with check for leap year */
/^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/
/* Date Format dd-mmm-YYYY or
dd/mmm/YYYY or
dd.mmm.YYYY */
/^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)(?:0?2|(?:Feb))\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/
9. Giờ
- Định dạng thời gian HH: MM 12 giờ , tùy chọn hàng đầu 0
/^(0?[1-9]|1[0-2]):[0-5][0-9]$/
- Định dạng thời gian HH: MM 12 giờ, tùy chọn hàng đầu 0, Meridiems (AM / PM)
/((1[0-2]|0?[1-9]):([0-5][0-9]) ?([AaPp][Mm]))/
- Định dạng thời gian HH: MM 24 giờ với 0 đầu
/^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/
- Định dạng thời gian HH: MM 24 giờ, tùy chọn hàng đầu 0
/^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/
- Định dạng thời gian HH: MM: SS 24 giờ
/(?:[01]\d|2[0123]):(?:[012345]\d):(?:[012345]\d)/
10. Thẻ HTML
- Elements với Attributes
/<\/?[\w\s]*>|<.+[\W]>/
11. Trình xử lý Javascript
- Trình xử lý nội tuyến JS
/\bon\w+=\S+(?=.*>)/
- Trình xử lý nội tuyến JS với phần tử
/(?:<[^>]+\s)(on\S+)=["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))+.)["']?/
12. Slug
- Slug
/^[a-z0-9]+(?:-[a-z0-9]+)*$/
13. Tìm bản Duplicates trong chuỗi
- Tìm Duplicates
/(\b\w+\b)(?=.*\b\1\b)/
14. Số điện thoại
- Số điện thoại quốc tế - với mã quốc gia / phần mở rộng tùy chọn
/* International Phone Numbers */
/^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$/
Lưu ý: Sử dụng regex để phê chuẩn số điện thoại duy nhất nếu bạn không có sự lựa chọn để sử dụng thư viện. Có một số thư viện xử lý số điện thoại chính xác hơn và nên được sử dụng thay thế.
15. Đường dẫn tệp
- Đường dẫn tệp với tên tệp và phần mở rộng
/((\/|\\|\/\/|https?:\\\\|https?:\/\/)[a-z0-9 [email protected]\-^!#$%&+={}.\/\\\[\]]+)+\.[a-z]+$/
- Đường dẫn tệp với tên tệp tùy chọn, phần mở rộng
/^(.+)/([^/]+)$/
- Tên tệp có phần mở rộng có 3 ký tự
/^[\w,\s-]+\.[A-Za-z]{3}$/
Các quy định bổ sung
1. Mã Zip
Có NO Regex duy nhất có thể xử lý tất cả các mã zip cho rằng mã zip trên toàn thế giới không theo một khuôn mẫu chung. Dưới đây là danh sách chứa Regex cụ thể cho từng quốc gia.
2. Xác thực thanh toán
Đây là đường dẫn chứa regex để xác thực các thẻ Tín dụng hàng đầu như Visa, Mastercard, v.v.
3. Chứng minh thư
- Số an sinh xã hội - Tài liệu tham khảo
- Hộ chiếu -
/^[A-PR-WY][1-9]\d\s?\d{4}[1-9]$/
Nguồn bài viết: https://digitalfortress.tech/tricks/top-15-commonly-used-regex/
Happy Coding!