Trả lời nhanh
Regex (biểu thức chính quy) là chuỗi mô tả một mẫu văn bản, ví dụ \d{3,} nghĩa là “từ 3 chữ số liền nhau trở lên”. Nhập biểu thức, chọn cờ (g để tìm tất cả, i để không phân biệt hoa thường) và dán văn bản: chỗ khớp được tô sáng ngay, kèm bảng nhóm bắt và lời giải thích từng thành phần.
Regex là gì?
Công cụ chạy biểu thức bằng chính bộ máy regex JavaScript của trình duyệt (giống JavaScript, TypeScript, Node.js), nên kết quả là kết quả bạn sẽ có trong mã. Mỗi lần gõ, chỗ khớp được tô sáng trong văn bản, bảng bên dưới liệt kê vị trí và từng nhóm bắt ($1, $2, nhóm có tên), phần thay thế cho xem văn bản sau khi đổi. Biểu thức chạy trong Web Worker có giới hạn 1,5 giây, nên một mẫu viết dở kiểu (a+)+ không làm treo trang. Văn bản bạn dán không rời khỏi trình duyệt.

Cách kiểm tra một biểu thức chính quy
- 1
Gõ biểu thức vào ô giữa hai dấu /, không cần viết dấu / ở hai đầu. Hoặc chọn một mẫu có sẵn (email, số điện thoại, CCCD…) để bắt đầu.
- 2
Bật các cờ cần dùng: g để tìm tất cả chỗ khớp, i để không phân biệt chữ hoa thường, m để ^ và $ áp dụng cho từng dòng, u để dùng \p{L} khớp chữ có dấu.
- 3
Dán văn bản cần kiểm tra. Chỗ khớp được tô màu xen kẽ, số kết quả hiện ở góc phải, bảng “Danh sách kết quả” cho vị trí và nhóm bắt.
- 4
Muốn đổi văn bản, bật “Thay thế” và nhập chuỗi thay thế với $1, $2 hoặc $<tên>; kết quả hiện ngay, bấm “Sao chép” để lấy.
- 5
Đọc phần “Giải thích từng thành phần” để kiểm tra biểu thức có đúng ý mình không trước khi dán vào mã.
Ký hiệu regex hay dùng
| Ký hiệu | Ý nghĩa | Ví dụ khớp |
|---|---|---|
| . | Một ký tự bất kỳ (trừ xuống dòng) | a.c khớp abc, a-c |
| \d \w \s | Chữ số, ký tự chữ (A–Z, 0–9, _), khoảng trắng | \d\d khớp 42 |
| [abc] [^abc] | Một ký tự trong / ngoài danh sách | [aeiou] khớp nguyên âm |
| * + ? | Lặp 0+ lần, 1+ lần, 0 hoặc 1 lần | colou?r khớp color, colour |
| {n} {n,} {n,m} | Lặp đúng n, ít nhất n, từ n đến m lần | \d{4} khớp 2026 |
| ^ $ | Đầu và cuối chuỗi (hoặc dòng với cờ m) | ^Xin khớp đầu câu |
| (…) (?<tên>…) (?:…) | Nhóm bắt, nhóm có tên, nhóm không bắt | (\d+)-(\d+) bắt 2 nhóm |
| a|b | Hoặc a hoặc b | mèo|chó |
| (?=…) (?!…) | Phía sau phải là / không được là | \d+(?=đ) khớp số đứng trước chữ đ |
| \b | Ranh giới từ | \bcat\b không khớp trong concat |
\w và \b chỉ hiểu chữ cái A–Z. Với tiếng Việt có dấu, dùng [\p{L}\p{M}]+ và bật cờ u.
Các cờ (flags) của regex JavaScript
| Cờ | Tác dụng | Khi nào bật |
|---|---|---|
| g | Tìm mọi chỗ khớp, không dừng ở chỗ đầu tiên | Đếm, liệt kê, thay thế tất cả |
| i | Không phân biệt chữ hoa thường | Tìm từ khoá bất kể cách viết |
| m | ^ và $ khớp đầu / cuối từng dòng | Xử lý văn bản nhiều dòng, log |
| s | Dấu . khớp cả ký tự xuống dòng | Bắt một khối nhiều dòng |
| u | Chế độ Unicode: \p{…}, emoji, \u{…} | Văn bản tiếng Việt, emoji |
| y | Chỉ khớp tại vị trí lastIndex | Viết bộ phân tích từ vựng |
Ví dụ thực tế
Lọc số điện thoại khỏi danh sách khách
Chọn mẫu “Số di động Việt Nam”, dán cột số điện thoại từ Excel: số hợp lệ được tô sáng, số bàn hay số thiếu chữ số không được tô, dễ thấy dòng cần sửa.
Đổi ngày từ dd/mm/yyyy sang yyyy-mm-dd
Biểu thức (\d{2})/(\d{2})/(\d{4}) với cờ g, bật Thay thế và nhập $3-$2-$1: “05/11/2026” thành “2026-11-05”, phù hợp để nhập vào cơ sở dữ liệu.
Tách mã đơn hàng trong email
Mã dạng DH-2026-000123: dùng DH-\d{4}-\d{6}. Bảng kết quả cho vị trí từng mã; muốn chỉ lấy phần số, bọc phần đó trong ngoặc để thành nhóm $1.
Kiểm tra mẫu trước khi đưa vào form
Thuộc tính pattern của thẻ input HTML dùng cùng cú pháp regex JavaScript (tự thêm ^ và $). Thử biểu thức ở đây với vài giá trị đúng và sai trước khi gắn vào trang.
Lỗi thường gặp và cách xử lý
- Chỉ thấy một kết quả dù văn bản có nhiều chỗ khớp.
- Bật cờ g. Không có g, regex dừng ở chỗ khớp đầu tiên (trong mã: String.match, replace cũng vậy).
- \w không khớp chữ “ă”, “đ”, “ơ”.
- \w chỉ gồm A–Z, a–z, 0–9 và _. Dùng [\p{L}\p{M}] kèm cờ u, hoặc liệt kê dải ký tự tiếng Việt cụ thể.
- Báo “quá thời gian” và dừng.
- Bộ lặp lồng nhau như (a+)+, (.*)*, (\w+\s?)* có thể thử hàng tỷ cách khi không khớp (catastrophic backtracking). Viết cụ thể hơn: bỏ lặp lồng, thay .* bằng [^,]* hoặc thêm ký tự neo.
- Dấu chấm khớp mọi thứ, kể cả chữ.
- Dấu . nghĩa là “một ký tự bất kỳ”. Muốn khớp đúng dấu chấm, viết \. (ví dụ tên miền example\.com).
- Biểu thức khớp quá nhiều (lấy cả đoạn dài).
- * và + mặc định “tham”, lấy càng nhiều càng tốt. Thêm ? để thành lazy: <.+?> thay vì <.+>.
- Chép sang mã thì sai, ở đây lại đúng.
- Trong chuỗi JavaScript / Java / C#, dấu \ phải viết thành \\ ("\\d+"). Dạng /\d+/ trong JavaScript thì giữ nguyên. Python, PHP và Go có vài khác biệt cú pháp (nhóm có tên, lookbehind).
Công cụ dùng bộ máy regex nào?
Biểu thức chạy bằng RegExp của trình duyệt theo chuẩn ECMAScript, giống hệt JavaScript và TypeScript ở trình duyệt hay Node.js. Phần lớn cú pháp thông dụng giống PCRE (PHP), Python, Java, nhưng có khác biệt nhỏ: Python viết nhóm có tên là (?P<tên>…), JavaScript là (?<tên>…); Go không hỗ trợ lookbehind và backreference.
Phần giải thích là bộ tách đơn giản viết riêng để người đọc dễ hiểu từng ký hiệu. Nó không thay thế trình biên dịch: kết quả khớp, lỗi cú pháp và thay thế luôn lấy từ chính RegExp của trình duyệt.
Vì sao có giới hạn 1,5 giây
Một số biểu thức có độ phức tạp tăng theo cấp số mũ khi văn bản không khớp. Ví dụ ^(a+)+$ với chuỗi 30 chữ a và một chữ b phải thử hơn một tỷ cách chia. Đây cũng là kiểu lỗi ReDoS từng làm sập nhiều dịch vụ web.
Công cụ chạy biểu thức trong Web Worker và dừng nếu quá 1,5 giây, rồi báo để bạn sửa mẫu. Nếu biểu thức bị dừng ở đây, nhiều khả năng nó cũng chậm khi chạy thật trên máy chủ.
Giới hạn của các mẫu có sẵn
Mẫu email, số điện thoại, CCCD, biển số xe chỉ kiểm tra hình thức để lọc nhanh, không xác minh dữ liệu có thật. Mỗi mẫu có ghi chú giới hạn ngay dưới ô chọn.
- Số di động: đầu số 03, 05, 07, 08, 09 (hoặc +84), 10 chữ số, không nhận dấu cách giữa các số.
- CCCD: 12 chữ số, bắt đầu bằng 0; ba số đầu là mã tỉnh nơi đăng ký khai sinh.
- Email: đủ cho đa số địa chỉ thường gặp, không phủ hết mọi trường hợp của chuẩn RFC 5322.
Thuật ngữ
- Regex / biểu thức chính quy
- Chuỗi mô tả một mẫu văn bản để tìm, kiểm tra hoặc thay thế.
- Cờ (flag)
- Tuỳ chọn thay đổi cách khớp: g, i, m, s, u, y.
- Nhóm bắt
- Phần trong ngoặc ( ) được lưu lại để dùng lại bằng $1, $2… hoặc \1.
- Bộ lặp (quantifier)
- *, +, ?, {n,m}: số lần phần đứng trước được lặp.
- Lookahead / lookbehind
- Điều kiện về phía sau / phía trước vị trí khớp mà không đưa vào kết quả.
- Backtracking
- Cơ chế thử lại cách khớp khác khi gặp ngõ cụt; quá nhiều sẽ làm regex rất chậm (ReDoS).
Câu hỏi thường gặp
Regex ở đây có giống trong PHP, Python không?
Phần lớn giống. Công cụ dùng chuẩn JavaScript (ECMAScript); một số cú pháp như nhóm có tên (?P<tên>) của Python, cờ x của PCRE thì khác. Kết quả trùng khớp 100% với JavaScript / TypeScript / Node.js.
Văn bản tôi dán có bị gửi đi không?
Không. Biểu thức và văn bản được xử lý trong trình duyệt của bạn (Web Worker), không gửi lên máy chủ.
Làm sao khớp chữ tiếng Việt có dấu?
Dùng [\p{L}\p{M}]+ và bật cờ u. \w chỉ hiểu chữ A–Z không dấu.
Vì sao bảng chỉ hiện 200 dòng?
Để trang vẫn nhẹ khi có hàng nghìn kết quả. Đoạn tô sáng và kết quả thay thế vẫn xử lý toàn bộ (tối đa 5.000 chỗ khớp).
$& và $1 khác nhau thế nào?
$& là toàn bộ đoạn khớp, $1 là nội dung nhóm bắt thứ nhất. $<tên> lấy nhóm có tên, $$ chèn một dấu $.
Biểu thức bị dừng vì quá thời gian thì phải làm sao?
Tìm chỗ có bộ lặp lồng nhau hoặc .* đứng cạnh nhau, viết lại cụ thể hơn (giới hạn ký tự, thêm neo ^ $, bỏ lặp lồng).
Đánh giá và bình luận
Đang tải…