Regular Expressions (Regex) là gì?
Regular expressions (Regex) là ngôn ngữ mẫu dùng để tìm kiếm, xác thực và xử lý văn bản.
Với regex, bạn có thể:
tìm các đoạn văn bản cụ thể (ví dụ: email, URL, số)
xác thực định dạng dữ liệu (kiểm tra biểu mẫu)
thay thế và làm sạch văn bản
trích xuất dữ liệu có cấu trúc từ chuỗi
Regex được sử dụng rộng rãi trong phát triển phần mềm, phân tích dữ liệu, SEO và tự động hóa.
Công cụ “Regex Tester” làm gì?
Công cụ này cho phép bạn kiểm tra regular expressions theo thời gian thực và xem ngay kết quả.
Với công cụ này, bạn có thể:
kiểm tra xem một chuỗi có khớp với mẫu hay không
xem tất cả các kết quả khớp trong văn bản
debug các biểu thức phức tạp
thử các biến thể regex khác nhau mà không cần viết mã
Các engine Regex phổ biến và sự khác biệt
Regular expressions không hoàn toàn mang tính phổ quát. Mức độ hỗ trợ cú pháp phụ thuộc vào ngôn ngữ lập trình và engine được sử dụng.
Engine | Sử dụng | Đặc điểm |
|---|
JavaScript (ECMAScript) | Trình duyệt, Node.js | Hỗ trợ lookbehind hạn chế (tùy phiên bản) |
PCRE | PHP, nhiều công cụ | Một trong những engine mạnh nhất |
Python (re) | Python | Thiếu một số tính năng của PCRE |
Java (Pattern) | Java | Cú pháp nghiêm ngặt |
.NET | C# | Khả năng mở rộng nâng cao |
Luôn kiểm tra regex trong đúng môi trường mà bạn sẽ sử dụng. Hãy chú ý đến sự khác biệt về lookbehind và hỗ trợ Unicode. Để tương thích đa nền tảng, nên ưu tiên các mẫu đơn giản hơn.
Các cờ (modifier flags) của Regex
Flags là các bộ điều chỉnh thay đổi cách mẫu được xử lý. Chúng cho phép bạn kiểm soát chữ hoa/chữ thường, phạm vi tìm kiếm (toàn bộ dòng hay nhiều dòng) và cách diễn giải ký tự.
Flag | Ý nghĩa |
|---|
i | Không phân biệt hoa thường |
g | Tìm kiếm toàn cục |
m | Chế độ nhiều dòng |
s | Dotall (bao gồm \n trong .) |
u | Unicode |
Các ký tự đặc biệt trong Regex
Kiểu | Ký hiệu | Mô tả |
|---|
Neo (vị trí) | ^ | Bắt đầu chuỗi |
Neo (vị trí) | $ | Kết thúc chuỗi |
Neo (vị trí) | \b | Ranh giới từ |
Neo (vị trí) | \B | Không phải ranh giới từ |
Ký tự meta | . | Khớp với bất kỳ ký tự nào ngoại trừ xuống dòng (\n) |
Ký tự meta | | | Toán tử HOẶC (OR) |
Ký tự meta | \ | Ký tự escape |
Ký tự literal | a | Ký tự “a” |
Ký tự literal | ab | Chuỗi “ab” |
Bộ định lượng | * | 0 hoặc nhiều lần lặp |
Bộ định lượng | ? | 0 hoặc 1 lần lặp |
Bộ định lượng | + | 1 hoặc nhiều lần lặp |
Bộ định lượng | {5} | Chính xác 5 lần lặp |
Bộ định lượng | {5,} | 5 hoặc nhiều lần lặp |
Bộ định lượng | {5,10} | Từ 5 đến 10 lần lặp |
Lớp ký tự | \s | Khoảng trắng |
Lớp ký tự | \S | Không phải khoảng trắng |
Lớp ký tự | \w | Ký tự từ (chữ + số + gạch dưới) |
Lớp ký tự | \W | Không phải ký tự từ |
Lớp ký tự | \d | Chữ số |
Lớp ký tự | \D | Không phải chữ số |
Chuỗi escape | [\b] | Backspace |
Chuỗi escape | \c | Ký tự điều khiển |
Chuỗi escape | \n | Xuống dòng |
Chuỗi escape | \t | Tab |
Chuỗi escape | \r | Ký tự về đầu dòng |
Chuỗi escape | \ZZZ | Ký tự bát phân |
Chuỗi escape | \xZZ | Ký tự thập lục phân |
Chuỗi escape | \0 | Ký tự null |
Chuỗi escape | \v | Tab dọc |
Nhóm | (xyz) | Nhóm bắt giữ |
Nhóm | (?:xyz) | Nhóm không bắt giữ |
Tập hợp và khoảng | [xyz] | Một trong x, y, z |
Tập hợp và khoảng | [^xyz] | Không phải x, y, z |
Tập hợp và khoảng | [a-q] | Khoảng từ a đến q |
Tập hợp và khoảng | [0-7] | Khoảng từ 0 đến 7 |
Mẫu thay thế | $` | Văn bản trước phần khớp |
Mẫu thay thế | $' | Văn bản sau phần khớp |
Mẫu thay thế | $+ | Nhóm bắt giữ cuối cùng |
Mẫu thay thế | $& | Toàn bộ chuỗi khớp |
Mẫu thay thế | $n | Nhóm bắt giữ thứ n (ví dụ: $1, $2) |
Lookaround | (?=xyz) | Positive lookahead |
Lookaround | (?!xyz) | Negative lookahead |
Lookaround | (?<=xyz) | Positive lookbehind |
Lookaround | (?<!xyz) | Negative lookbehind |
Bình luận | (?#comment) | Bình luận (engine sẽ bỏ qua) |
Các mẫu Regex thường dùng
Tác vụ | Regex |
|---|
Chỉ chữ số | ^\d+$ |
Chỉ chữ cái Latin | ^[A-Za-z]+$ |
Ngày (DD.MM.YYYY) | \d{2}\.\d{2}\.\d{4} |
Tên miền | ^[a-z0-9.-]+\.[a-z]{2,}$ |
URL | https?:\/\/[^\s]+ |
Slug | ^[a-z0-9-]+$ |
Email (cơ bản) | ^[^\s@]+@[^\s@]+\.[^\s@]+$ |
Email (nghiêm ngặt) | ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$ |
Điện thoại (chung) | ^\+?\d{7,15}$ |
Thẻ HTML | <[^>]+> |
Mật khẩu mạnh | ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{12,}$ |
UUID | ^[0-9a-fA-F-]{36}$ |
Màu HEX | ^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$ |
IP (IPv4) | ^(\d{1,3}\.){3}\d{1,3}$ |
Địa chỉ MAC | ^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$ |
Những lỗi Regex thường gặp
Regular expressions thường trông có vẻ đơn giản, nhưng thực tế có rất nhiều chi tiết dễ gây nhầm lẫn. Dưới đây là những lỗi phổ biến dẫn đến kết quả không chính xác.
Lỗi cú pháp và logic
Thiếu escape: . khớp với mọi ký tự, không phải dấu chấm literal → dùng \.
Dùng sai bộ định lượng: *, +, {} áp dụng cho token phía trước, không phải toàn bộ chuỗi
Nhầm giữa greedy và lazy: .* là greedy → dùng .*? nếu cần khớp tối thiểu
Vấn đề khi khớp chuỗi
Thiếu neo ^ và $: nếu không có, regex có thể khớp ở bất kỳ đâu trong chuỗi
Phân biệt hoa/thường: "Test" ≠ "test" → dùng flag i nếu cần
Nhầm lẫn với khoảng trắng: \s bao gồm tab, xuống dòng, v.v., không chỉ là dấu cách
Lỗi trong sử dụng thực tế
Dùng \w cho Unicode: trong hầu hết engine, \w = [A-Za-z0-9_] (không bao gồm Cyrillic, v.v.)
Dùng regex để parse định dạng phức tạp (HTML, JSON): không đáng tin cậy → nên dùng parser chuyên dụng
Biểu thức quá phức tạp: khó bảo trì và debug
Vấn đề hiệu năng