Hướng Dẫn Chi Tiết Về Biểu Thức Chính Quy (Regex)
· 6 min read
Biểu thức chính quy (Regular Expression hay Regex) là một chuỗi ký tự đặc biệt định nghĩa một mẫu tìm kiếm. Công cụ này cực kỳ mạnh mẽ để xử lý và thao tác với văn bản.
1. Regex Là Gì?
Regex là một chuỗi các ký tự đặc biệt giúp bạn:
- Tìm kiếm văn bản theo mẫu
- Xác thực định dạng dữ liệu (email, số điện thoại,...)
- Trích xuất thông tin từ văn bản
- Thay thế và chỉnh sửa văn bản theo mẫu
2. Các Thành Phần Cơ Bản
2.1. Ký Tự Đơn Giản
Ký tự | Ý nghĩa | Ví dụ |
---|---|---|
a-z | Khớp với bất kỳ chữ cái thường | cat khớp "cat", "scatter" |
A-Z | Khớp với bất kỳ chữ cái hoa | CAT khớp "CAT", "CATCH" |
0-9 | Khớp với bất kỳ chữ số | 123 khớp "123", "12345" |
2.2. Ký Tự Đặc Biệt
Ký tự | Ý nghĩa | Ví dụ |
---|---|---|
. | Khớp với bất kỳ ký tự nào (trừ xuống dòng) | c.t khớp "cat", "cut", "c@t" |
\d | Khớp với chữ số [0-9] | \d{3} khớp "123", "456" |
\w | Khớp với ký tự từ [a-zA-Z0-9_] | \w+ khớp "abc123" |
\s | Khớp với khoảng trắng (space, tab) | a\sb khớp "a b" |
2.3. Số Lượng
Ký tự | Ý nghĩa | Ví dụ |
---|---|---|
? | 0 hoặc 1 lần | colou?r khớp "color" và "colour" |
* | 0 hoặc nhiều lần | go*gle khớp "ggle", "google", "gooogle" |
+ | 1 hoặc nhiều lần | go+gle khớp "google", "gooogle" |
{n} | Đúng n lần | \d{3} khớp "123" |
{n,} | Ít nhất n lần | \d{2,} khớp "12", "123", "1234" |
{n,m} | Từ n đến m lần | \d{2,4} khớp "12", "123", "1234" |
3. Các Kỹ Thuật Nâng Cao
3.1. Nhóm và Tham Chiếu
(abc) # Nhóm các ký tự
\1 # Tham chiếu đến nhóm thứ nhất
(?:abc) # Nhóm không lưu
Ví dụ:
(ha)\1
khớp với "haha"(\w+)\s+\1
tìm từ lặp lại: "hello hello"
3.2. Khẳng Định và Phủ Định
(?=...) # Khẳng định phía trước
(?!...) # Phủ định phía trước
(?<=...) # Khẳng định phía sau
(?<!...) # Phủ định phía sau
Ví dụ:
\w+(?=@)
khớp username trong email\b\w+(?<!ing)\b
tìm từ không kết thúc bằng "ing"
4. Ví Dụ Thực Tế
4.1. Xác Thực Email
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
Giải thích từng phần:
^
: Bắt đầu chuỗi[a-zA-Z0-9._%+-]+
: Username có thể chứa chữ, số và ký tự đặc biệt@
: Ký tự @[a-zA-Z0-9.-]+
: Tên miền\.
: Dấu chấm[a-zA-Z]{2,}
: Phần mở rộng (.com, .net,...)$
: Kết thúc chuỗi
4.2. Xác Thực Số Điện Thoại Việt Nam
^(0|\+84)(\s|\.)?((3[2-9])|(5[689])|(7[06-9])|(8[1-689])|(9[0-46-9]))(\d){7}$
Giải thích:
- Bắt đầu bằng 0 hoặc +84
- Theo sau là các đầu số nhà mạng hợp lệ
- Kết thúc với 7 chữ số
4.3. Xác Thực Mật Khẩu Mạnh
^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$
Yêu cầu mật khẩu phải có:
- Ít nhất 8 ký tự
- Ít nhất 1 chữ hoa
- Ít nhất 1 chữ thường
- Ít nhất 1 số
- Ít nhất 1 ký tự đặc biệt
4.4. Xác Thực URL
^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$
Giải thích:
https?:\/\/
: Bắt đầu bằng http:// hoặc https:// (không bắt buộc)[\da-z\.-]+
: Tên miền chính (vd: google, facebook)[a-z\.]{2,6}
: Phần mở rộng (.com, .net, .org,...)[\/\w \.-]*
: Các đường dẫn phụ (/path/to/page)
4.5. Xác Thực Ngày Tháng
^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[13-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})$
Hỗ trợ các định dạng:
- DD/MM/YYYY
- DD-MM-YYYY
- DD.MM.YYYY Kiểm tra cả năm nhuận và số ngày hợp lệ trong tháng.
4.6. Trích Xuất Thẻ HTML
<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)
Ví dụ sử dụng:
<div class="container">Content</div>
<img src="image.jpg" />
4.7. Xác Thực Mã Màu HEX
^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$
Hỗ trợ cả định dạng:
- 6 ký tự: #FF0000
- 3 ký tự: #F00
4.8. Xác Thực IPv4
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
Ví dụ hợp lệ:
- 192.168.1.1
- 10.0.0.0
- 172.16.254.1
4.9. Tìm Kiếm Thẻ IMG Trong HTML
<img\s+[^>]*src="([^"]*)"[^>]*>
Trích xuất được:
<img src="photo.jpg">
<img alt="Photo" src="photo.jpg" class="img">
4.10. Xác Thực Tên File
^[\w,\s-]+\.[A-Za-z]{3,4}$
Ví dụ hợp lệ:
- document.pdf
- image-001.jpg
- my_file.docx
4.11. Tìm Từ Trùng Lặp
\b(\w+)\s+\1\b
Phát hiện:
- "the the"
- "is is"
- "word word"
4.12. Xác Thực Số CMND/CCCD Việt Nam
^(\d{9}|\d{12})$
Hỗ trợ:
- CMND 9 số
- CCCD 12 số
4.13. Xác Thực Mã Bưu Chính Việt Nam
^[0-9]{6}$
Ví dụ:
- 700000 (TP.HCM)
- 100000 (Hà Nội)
4.14. Tìm Kiếm Hashtag
#[a-zA-Z0-9_]+
Phát hiện:
- #programming
- #regex101
- #webDev
4.15. Xác Thực Tên Người Việt Nam
^[A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸĐ][a-zàáạảãâầấậẩẫăằắặẳẵèéẹẻẽêềếệểễìíịỉĩòóọỏõôồốộổỗơờớợởỡùúụủũưừứựửữỳýỵỷỹđ]*(?:[ ][A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸĐ][a-zàáạảãâầấậẩẫăằắặẳẵèéẹẻẽêềếệểễìíịỉĩòóọỏõôồốộổỗơờớợởỡùúụủũưừứựửữỳýỵỷỹđ]*)*$
Đặc điểm:
- Hỗ trợ đầy đủ dấu tiếng Việt
- Mỗi từ bắt đầu bằng chữ hoa
- Cho phép nhiều từ cách nhau bởi dấu cách
5. Sử Dụng Trong Các Ngôn Ngữ
5.1. JavaScript
// Kiểm tra định dạng email
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
const isValidEmail = emailRegex.test("[email protected]");
// Tìm tất cả số trong văn bản
const text = "Có 123 và 456 trong văn bản";
const numbers = text.match(/\d+/g); // ["123", "456"]
5.2. Python
import re
# Tìm kiếm
text = "Liên hệ: [email protected] hoặc [email protected]"
emails = re.findall(r'[\w\.-]+@[\w\.-]+', text)
# Thay thế
phone = "0123-456-789"
formatted = re.sub(r'(\d{4})-(\d{3})-(\d{3})', r'(\1) \2-\3', phone)
6. Công Cụ Hỗ Trợ
-
Regex101 (https://regex101.com)
- Kiểm tra regex trực tuyến
- Giải thích chi tiết từng phần
- Hỗ trợ nhiều flavor regex
-
RegExr (https://regexr.com)
- Giao diện thân thiện
- Có thư viện mẫu
- Tham khảo nhanh
7. Lưu Ý Quan Trọng
-
Hiệu năng
- Tránh backtracking quá nhiều
- Sử dụng nhóm không lưu (?:) khi không cần thiết
- Cân nhắc độ phức tạp của pattern
-
Bảo mật
- Cẩn thận với ReDoS (Regular Expression Denial of Service)
- Giới hạn độ dài input khi cần thiết
- Tránh regex quá phức tạp với input không đáng tin cậy
-
Khả năng bảo trì
- Viết regex có cấu trúc rõ ràng
- Thêm comment giải thích các phần phức tạp
- Chia nhỏ regex phức tạp thành nhiều phần
8. Kết Luận
Regex là công cụ mạnh mẽ nhưng cần thời gian để thành thạo. Bắt đầu với các mẫu đơn giản và dần dần học thêm các kỹ thuật nâng cao. Thực hành thường xuyên và tham khảo tài liệu khi cần thiết.