Form đăng ký yêu cầu validate số điện thoại Việt Nam — bạn biết regex là giải pháp, nhưng vừa gõ vào là lỗi ngay vì thiếu một dấu \. Hoặc bạn đang cần extract tất cả địa chỉ email từ file log hàng nghìn dòng, hay muốn đảm bảo một trường nhập liệu chỉ nhận ký tự chữ-số. Regex giải quyết được tất cả chỉ trong một dòng — nhưng cú pháp của nó không tha lỗi nhỏ, và lỗi regex thường im lặng: pattern không khớp gì thay vì báo sai.
Bài này đi qua cú pháp regex cơ bản đủ dùng, cách test mẫu trực tiếp để thấy ngay kết quả, và một số pattern hay dùng cho lập trình viên Việt.
Test nhanh: gõ biểu thức chính quy vào công cụ test regex, dán văn bản mẫu vào, kết quả khớp hiện ngay theo thời gian thực. Không cần cài đặt, không cần đăng nhập.
Cú pháp regex cơ bản cần biết
Regex (Regular Expression) là ngôn ngữ mô tả mẫu văn bản. Một mẫu regex là chuỗi ký tự thường kết hợp với ký tự đặc biệt mô tả quy tắc khớp.
Các ký hiệu nền tảng:
Ký hiệuÝ nghĩaVí dụKhớp với.Bất kỳ ký tự nào (trừ newline)a.cabc, a1c, a-c*0 hoặc nhiều lầnab*cac, abc, abbc+1 hoặc nhiều lầnab+cabc, abbc (không phải ac)?0 hoặc 1 lần (tùy chọn)colou?rcolor, colour^Đầu chuỗi^helloChuỗi bắt đầu bằng "hello"$Cuối chuỗiworld$Chuỗi kết thúc bằng "world"[abc]Một trong các ký tự[aeiou]Nguyên âm[^abc]Không phải các ký tự này[^0-9]Không phải chữ số\dChữ số (0-9)\d+Một hoặc nhiều chữ số\wChữ-số-gạch dưới\w+Một "từ"\sKhoảng trắng\s+Khoảng trắng/tab/newline{n,m}Từ n đến m lần (hoặc đúng n: {n})\d{2,4}2 đến 4 chữ số(...)Nhóm khớp (capture group)(ab)+ab, abab
Một lưu ý với tiếng Việt: ký tự có dấu như ă, ê, ơ, ư… không khớp với \w trong hầu hết regex engine vì \w chỉ bao gồm [a-zA-Z0-9_]. Nếu cần khớp chữ tiếng Việt, hãy dùng Unicode class \p{L} (nếu engine hỗ trợ) hoặc liệt kê rõ các ký tự trong [...].
4 bước viết, test và ứng dụng regex
Bước 1 — Test biểu thức trực tiếp (thấy ngay kết quả)
Thay vì gõ regex vào code rồi chạy thử, paste vào công cụ để thấy ngay từng phần khớp được tô sáng — sửa mẫu đến khi đúng rồi mới copy vào code.
👉 Test ngay: công cụ test regex (nhập regex ở ô trên, nhập văn bản mẫu ở ô dưới, kết quả khớp hiện theo thời gian thực).
Ví dụ: bạn muốn validate số điện thoại VN (10 chữ số, bắt đầu 0):
^0\d{9}$Paste vào công cụ, thêm text mẫu:
0912345678 <- khop
0987654321 <- khop
091234567 <- khong khop (chi 9 so)
+84912345678 <- khong khop (co dau +84)Thấy ngay dòng nào khớp, dòng nào không — chỉnh mẫu tại chỗ đến khi đúng ý.
Lỗi hay gặp:
Quên escape dấu chấm: trong regex,
.khớp mọi ký tự, không phải dấu chấm thật. Muốn khớp dấu chấm thật phải viết\.— lỗi này phổ biến khi validate địa chỉ IP hoặc email.Quên
^và$: không có^và$, mẫu khớp ở bất kỳ vị trí nào trong chuỗi.\d{10}sẽ khớp cả trongabc0123456789xyz, không phải chỉ chuỗi 10 chữ số thuần.Flag quan trọng:
g(global — tìm tất cả, không chỉ lần đầu),i(case-insensitive),m(multiline —^/$khớp mỗi dòng). Quên flagglà nguyên nhân phổ biến khiến code chỉ thay thế lần khớp đầu tiên.
Bước 2 — So sánh kết quả trước và sau xử lý
Sau khi dùng regex để thay thế hoặc chuẩn hóa văn bản, bạn muốn xác nhận output đúng như kỳ vọng và không có gì bị mất hay bị sai.
👉 So sánh: công cụ so sánh văn bản (paste văn bản gốc và kết quả sau xử lý, xem điểm khác nhau).
Ví dụ: bạn dùng regex \s{2,} thay bằng một khoảng trắng để chuẩn hóa văn bản có nhiều space thừa. Paste trước và sau vào text-diff để xác nhận chỉ có khoảng trắng thừa bị xử lý, không có ký tự khác bị thay đổi nhầm.
Lỗi hay gặp:
Regex "tham" (greedy) khớp nhiều hơn dự định:
<.+>sẽ khớp từ thẻ đầu tiên<đến thẻ cuối cùng>trong cả đoạn HTML, không phải từng thẻ riêng. Dùng<.+?>(non-greedy/lazy) để khớp ngắn nhất. Text-diff giúp thấy rõ sự khác biệt.
Bước 3 — Tạo slug URL từ chuỗi sau khi chuẩn hóa
Một use case phổ biến của regex là chuẩn hóa chuỗi để tạo URL slug — bỏ ký tự đặc biệt, thay khoảng trắng bằng dấu gạch nối, chuyển về chữ thường. Nếu chuỗi có tiếng Việt, bước bỏ dấu cần xử lý riêng.
👉 Tạo slug: công cụ tạo slug (dán chuỗi tiếng Việt, nhận slug chuẩn URL ngay).
Ví dụ: Biểu thức chính quy trong JavaScript → slugify → bieu-thuc-chinh-quy-trong-javascript.
Tại sao dùng công cụ slugify thay vì tự viết regex? Vì bỏ dấu tiếng Việt đúng đòi hỏi bảng mapping ký tự đầy đủ (ví dụ ơ → o, ư → u, đ → d) — sai một ký tự là URL lạ hoặc SEO kém.
Lỗi hay gặp:
Dùng regex đơn giản
[^a-z0-9]để "bỏ ký tự lạ": cách này xóa hoàn toàn chữ tiếng Việt thay vì chuyển về dạng không dấu, kết quả slug thiếu từ và mất nghĩa.
Bước 4 — Phân tích URL để viết regex khớp đúng phần cần
Khi cần viết regex cho URL, biết trước URL gồm những phần nào giúp bạn khớp chính xác hơn — thay vì viết mẫu cho cả chuỗi dài trong khi thực ra chỉ cần một phần.
👉 Phân tích URL: công cụ phân tích url (dán URL, xem protocol/host/path/query/fragment riêng biệt).
Ví dụ URL https://tools.bkns.vn/vi/tools/regex-tester?q=test có path = /vi/tools/regex-tester — bạn chỉ cần viết regex /vi/tools/[a-z-]+ cho phần path thay vì xử lý cả URL đầy đủ.
Lỗi hay gặp:
Quên escape dấu chấm trong host:
tools.bkns.vntrong regex phải viếttools\.bkns\.vn, nếu không dấu.sẽ khớp bất kỳ ký tự nào.
Test xong thì ứng dụng vào code thế nào?
Copy vào code: mẫu từ công cụ dùng được ngay trong JavaScript và Python. Trong chuỗi Java/C#,
\cần escape thành\\— ví dụ\dviết thành"\\d"trong string literal.Hiệu năng: regex phức tạp có thể chậm trên văn bản dài (backtracking cao). Nếu regex chạy server-side trên dữ liệu người dùng, test với input lớn trước khi deploy.
Khi nào dùng parser thay regex: parse HTML đầy đủ hoặc xử lý JSON/XML — những trường hợp này dùng parser chuyên dụng sẽ chắc chắn hơn.
Câu hỏi thường gặp (FAQ)
Regex có hoạt động như nhau ở mọi ngôn ngữ không? Cú pháp cơ bản khá tương đồng (., *, +, ?, [], ^, $, \d, \w, \s), nhưng tính năng nâng cao như lookahead (?=), lookbehind (?<=), named groups ((?<name>...)) và Unicode class (\p{L}) có thể khác nhau giữa Python, JavaScript, Java, PHP, Go. Luôn test trên đúng engine của ngôn ngữ bạn đang dùng.
Regex cho email chuẩn nhất trông như thế nào? Regex validate email đơn giản thường dùng là ^[^\s@]+@[^\s@]+\.[^\s@]+$ — kiểm tra có @ và dấu chấm ở domain. Regex chuẩn RFC 5321 đầy đủ rất dài và hiếm khi cần thiết trong thực tế. Với validate nghiêm ngặt hơn (ví dụ email doanh nghiệp), cách tốt nhất là gửi email xác nhận hơn là chỉ dựa vào regex.
Số điện thoại VN nên validate bằng regex nào? Số di động VN thường 10 chữ số, bắt đầu bằng 03, 05, 07, 08, 09. Mẫu cơ bản: ^(0[35789]\d{8})$. Nếu cũng cần chấp nhận định dạng +84: ^(\+84|0)[35789]\d{8}$. Luôn test với số thật trước khi dùng.
Có cần lo về hiệu năng regex không? Với validate form đơn giản thì không đáng kể. Nhưng regex nhiều .* và backtracking trên văn bản dài có thể gây chậm — test với input thật trước khi dùng trong API xử lý dữ liệu người dùng.
BKNS Tools — bộ công cụ lập trình miễn phí cho developer Việt. Test Regex · So sánh văn bản · Tạo slug · Phân tích URL — không cần đăng nhập.




