Biểu thức chính quy cho người thường: Hướng dẫn thực tế
Biểu thức chính quy (regex) có vấn đề về danh tiếng. Chúng trông như ai đó ngủ quên trên bàn phím: ^[\w.-]+@[\w-]+\.[\w.]+$. Chúng xuất hiện trong code review, trình soạn thảo văn bản, công cụ tìm kiếm và xác thực biểu mẫu. Lập trình viên hoặc yêu thích chúng hoặc tránh hoàn toàn.
Sự thật nằm ở giữa. Regex thực sự mạnh mẽ. Nó cũng thực sự gây nhầm lẫn lúc đầu. Nhưng bạn không cần thành thạo mọi tính năng khó hiểu để có giá trị thực tế. Một nắm mẫu bao phủ phần lớn các trường hợp sử dụng thực tế.
Regex thực sự làm gì
Biểu thức chính quy là mẫu mô tả tập hợp chuỗi. Bạn đưa nó cho công cụ tìm kiếm, và nó tìm mọi chuỗi khớp với mẫu. Hãy nghĩ nó như truy vấn tìm kiếm rất chính xác.
Tìm kiếm thường: tìm chính xác "xin chào" Tìm kiếm regex: tìm bất cứ thứ gì trông như địa chỉ email, số điện thoại, ngày tháng, URL, hoặc bất kỳ mẫu nào bạn có thể mô tả.
Bạn có biết? Biểu thức chính quy được nhà toán học Stephen Kleene phát minh năm 1956 như ký hiệu mô tả "ngôn ngữ chính quy" trong lý thuyết ngôn ngữ hình thức. Chúng đi vào lĩnh vực máy tính qua các trình soạn thảo văn bản Unix đầu tiên những năm 1960 và 1970.
Các thành phần cơ bản
Ký tự chữ
Regex đơn giản nhất chỉ là văn bản chữ. Mẫu hello khớp chuỗi "hello." Không có gì phức tạp.
Dấu chấm (.) — Bất kỳ ký tự đơn nào
Dấu chấm khớp bất kỳ ký tự đơn nào (trừ xuống dòng).
h.tkhớp "hat," "hit," "hot," "hut," và cả "h3t"
Lớp ký tự ([]) — Ký tự cụ thể
Ngoặc vuông xác định tập ký tự cho phép tại vị trí đó.
[aeiou]khớp bất kỳ nguyên âm đơn nào[0-9]khớp bất kỳ chữ số nào[A-Za-z]khớp bất kỳ chữ cái nào (hoa hoặc thường)[^0-9]khớp bất kỳ ký tự nào KHÔNG phải chữ số (^trong ngoặc vuông nghĩa là "không")
Bộ định lượng — Bao nhiêu
Các ký hiệu này kiểm soát lặp lại:
| Ký hiệu | Ý nghĩa | Ví dụ | Khớp |
|---|---|---|---|
* |
Không hoặc nhiều | ab*c |
"ac," "abc," "abbc," "abbbc" |
+ |
Một hoặc nhiều | ab+c |
"abc," "abbc," "abbbc" (không "ac") |
? |
Không hoặc một | colou?r |
"color" và "colour" |
{3} |
Chính xác 3 | a{3} |
"aaa" |
{2,4} |
Từ 2 đến 4 | a{2,4} |
"aa," "aaa," "aaaa" |
Neo — Vị trí
^ở đầu nghĩa là "đầu chuỗi"$ở cuối nghĩa là "cuối chuỗi"^hello$chỉ khớp chính xác chuỗi "hello," không "say hello" hay "hello world"
Lớp viết tắt
Các lớp ký tự phổ biến có phím tắt:
| Viết tắt | Tương đương | Ý nghĩa |
|---|---|---|
\d |
[0-9] |
Bất kỳ chữ số |
\w |
[A-Za-z0-9_] |
Bất kỳ ký tự "từ" |
\s |
[ \t\n\r] |
Bất kỳ khoảng trắng |
\D |
[^0-9] |
Bất kỳ không-chữ-số |
\W |
[^A-Za-z0-9_] |
Bất kỳ không-ký-tự-từ |
\S |
[^ \t\n\r] |
Bất kỳ không-khoảng-trắng |
Nhóm (()) — Nhóm và bắt
Ngoặc tròn nhóm các phần của mẫu. Hữu ích cho áp dụng bộ định lượng cho nhóm hoặc trích xuất phần cụ thể của kết quả khớp.
(ab)+khớp "ab," "abab," "ababab"(\d{3})-(\d{4})khớp "555-1234" và bắt "555" và "1234" riêng biệt
Ống (|) — Hoặc
Ống nghĩa là "hoặc."
cat|dogkhớp "cat" hoặc "dog"(jpg|png|gif)khớp bất kỳ phần mở rộng ảnh nào trong ba
Mẫu thực tế bạn có thể dùng ngay
Khớp địa chỉ email (đơn giản)
[\w.-]+@[\w-]+\.[\w.]+
Phân tích:
[\w.-]+— một hoặc nhiều ký tự từ, dấu chấm hoặc gạch ngang (phần local)@— ký hiệu @ chữ[\w-]+— một hoặc nhiều ký tự từ hoặc gạch ngang (tên miền)\.— dấu chấm chữ (escape vì.là ký tự đặc biệt)[\w.]+— một hoặc nhiều ký tự từ hoặc dấu chấm (TLD)
Cảnh báo Xác thực email bằng regex nổi tiếng là khó làm hoàn hảo. Mẫu đơn giản ở trên bao phủ 99% địa chỉ email thực tế nhưng không xử lý mọi trường hợp biên trong đặc tả RFC. Cho xác thực production, hãy dùng thư viện xác thực email của ngôn ngữ lập trình.
Khớp số điện thoại Việt Nam
0\d{9,10}
Khớp: 0912345678, 02812345678
Khớp URL
https?://[\w.-]+(/[\w./-]*)?
Khớp:
Khớp ngày (YYYY-MM-DD)
\d{4}-\d{2}-\d{2}
Khớp: 2026-03-23, 1999-12-31, v.v.
Tìm từ lặp
\b(\w+)\s+\1\b
Khớp từ lặp như "the the" hoặc "is is." \1 tham chiếu lại nhóm đầu tiên đã bắt.
Khớp địa chỉ IPv4
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
Khớp mẫu như 192.168.1.1 hoặc 10.0.0.255.
Mẹo viết Regex
1. Bắt đầu đơn giản, rồi tinh chỉnh
Đừng cố viết regex hoàn hảo ngay lần đầu. Bắt đầu với mẫu rộng, kiểm tra với dữ liệu, và siết chặt dần.
2. Luôn kiểm tra
Regex dễ sai. Thiếu bộ định lượng hoặc dấu chấm chưa escape có thể thay đổi hoàn toàn kết quả khớp. Luôn kiểm tra mẫu với dữ liệu thực trước khi dùng trong production.
3. Escape ký tự đặc biệt
Nếu cần khớp dấu chấm, ngoặc tròn, ngoặc vuông hoặc ký tự đặc biệt khác, escape bằng dấu gạch chéo ngược: \., \(, \[.
4. Dùng bình luận và nhóm có tên
Trong mẫu phức tạp, dùng nhóm có tên và bình luận (nơi được hỗ trợ) để regex dễ đọc. Bạn tương lai sẽ cảm ơn bạn.
5. Biết khi nào không dùng regex
Regex là công cụ sai cho phân tích HTML, XML, JSON hoặc bất kỳ cấu trúc lồng nhau nào. Dùng parser phù hợp cho những thứ đó.
Mẹo Kiểm tra và gỡ lỗi mẫu regex theo thời gian thực: Cách kiểm tra mẫu Regex. Dán mẫu và dữ liệu kiểm tra, xem kết quả khớp được highlight ngay lập tức.
Bắt đầu kiểm tra regex ngay:
Miễn phí, phản hồi tức thì và không cần đăng ký.