Kiểm tra Regex
Kiểm tra biểu thức chính quy (regex) với highlight trực tiếp, capture group và xem trước thay thế — hoàn toàn trên trình duyệt của bạn.
Engine: biểu thức chính quy JavaScript (ECMAScript), chạy ngay trong trình duyệt của bạn. Hành vi có thể khác PCRE, Python, Go, Java hay .NET.
Giải thích pattern
Nhập pattern để xem giải thích từng thành phần.
Thư viện pattern mẫu
Nhấn vào một pattern để nạp (kèm văn bản mẫu) vào ô kiểm thử.
Mỗi dòng một trường hợp. Bắt đầu bằng "+ " nếu pattern PHẢI khớp, hoặc "- " nếu KHÔNG được khớp (cờ g và y bị bỏ qua ở đây).
Sinh code
Nhập pattern để sinh code.
Pattern được giữ nguyên (chỉ chuyển đổi nhóm có tên, cờ và ký hiệu thay thế). Hãy kiểm tra lookbehind, tham chiếu ngược và Unicode ở engine đích.
- \d — một chữ số bất kỳ (0–9)
- \w — một ký tự chữ/số/gạch dưới bất kỳ
- \s — một ký tự khoảng trắng bất kỳ
- . — bất kỳ ký tự nào ngoại trừ ký tự xuống dòng
- ^ — đầu chuỗi (hoặc đầu dòng, nếu bật cờ multiline)
- $ — cuối chuỗi (hoặc cuối dòng, nếu bật cờ multiline)
- * — lặp lại 0 lần trở lên của ký tự/nhóm trước đó
- + — lặp lại 1 lần trở lên của ký tự/nhóm trước đó
- ? — lặp lại 0 hoặc 1 lần của ký tự/nhóm trước đó
- {n,m} — lặp lại từ n đến m lần
- (...) — capturing group, (?:...) — non-capturing group
- \b — ranh giới từ (word boundary), | — phép OR (một trong hai)
Kiểm tra regex ngay trên trình duyệt hoạt động thế nào?
Biểu thức chính quy (regular expression, hay regex) là một ngôn ngữ mẫu gọn nhẹ dùng để khớp văn bản — từ việc "chuỗi này có giống địa chỉ email không" đến "tìm mọi số điện thoại trong tài liệu này" hay "bóc tách các thẻ HTML khỏi chuỗi này". Vấn đề là cú pháp regex rất dễ viết sai một cách tinh vi: một dấu `.` lẽ ra phải escape, một dấu `*` tham lam nuốt nhiều hơn dự tính, một group tưởng bắt được thứ mình cần nhưng thực ra không phải. Viết regex mà không kiểm tra trước, rồi chỉ phát hiện nó sai khi đã chạy trên dữ liệu thật ngoài production, là một cách học bài học đó khá đắt giá.
Công cụ này chạy hoàn toàn bằng engine `RegExp` có sẵn của JavaScript, thực thi ngay trên trình duyệt của bạn ngay khi gõ — không có server nào tham gia cả, nên bất kỳ văn bản nào bạn dùng để kiểm tra (có thể là dữ liệu người dùng thật, dòng log, hay bất cứ thứ gì bạn không muốn dán vào một dịch vụ bên thứ ba) sẽ không bao giờ rời khỏi máy của bạn. Vì đây chính xác là engine mà code JavaScript của bạn sẽ chạy khi lên production, những gì bạn thấy ở đây — ký tự nào khớp, quantifier tham lam hoạt động ra sao, group có bắt được gì hay không — chính xác là kết quả bạn sẽ nhận được lúc chạy thật, không phải một phiên bản xấp xỉ từ một "phương ngữ" regex khác.
Gõ một mẫu regex và bật các cờ (flags) cần thiết: `g` để tìm mọi kết quả khớp thay vì dừng lại ở kết quả đầu tiên, `i` để không phân biệt hoa thường, `m` để `^` và `$` khớp theo đầu/cuối từng dòng thay vì cả chuỗi, `s` để `.` khớp cả ký tự xuống dòng. Mọi kết quả khớp trong chuỗi kiểm tra được highlight ngay lập tức, và mỗi kết quả được liệt kê chi tiết bên dưới gồm chuỗi khớp đầy đủ, vị trí, cùng mọi capture group — kể cả named group như `(?<year>\d{4})` — để bạn thấy ngay group mình định lấy có thực sự khớp đúng thứ mong muốn hay không. Phần Thay thế cho thấy chính xác kết quả mà `String.replace()` sẽ trả về với mẫu regex và chuỗi thay thế của bạn, kể cả backreference tới group như `$1` hay `$<year>`.
Bảng tra cứu nhanh bên dưới liệt kê những ký hiệu người dùng hay quên nhất giữa lúc đang viết regex — sự khác biệt giữa `*` và `+`, non-capturing group `(?:...)` dùng để làm gì, `\b` đánh dấu ranh giới từ ra sao — mà không cần rời trang để tra cứu. Khi đã có một mẫu regex hoạt động đúng như ý trên dữ liệu thử nghiệm sát thực tế, bạn có thể dán thẳng vào code. Nếu cần kiểm tra hoặc định dạng lại chính dữ liệu xung quanh đó, công cụ Định dạng & kiểm tra JSON và So sánh văn bản là hai công cụ đồng hành tự nhiên.
Câu hỏi thường gặp
Một pattern regex sai có làm treo trang không?
Không — việc khớp chạy trong một Web Worker riêng có giới hạn thời gian cứng, nên kể cả pattern gây catastrophic backtracking cũng không thể làm treo tab.
Công cụ có hiện capture group có tên và theo số không?
Có — mỗi kết quả khớp liệt kê đủ group theo số thứ tự và mọi named group kiểu (?<year>\d{4}).
Có thể xem trước kết quả thay thế trước khi dùng trong code không?
Có — phần Thay thế hiện chính xác kết quả mà String.replace() sẽ trả về, kể cả backreference tới group.