Kiểm tra Regex
Nhập mẫu, đánh dấu các cờ cần dùng và dán văn bản vào: mọi kết quả khớp được tô sáng ngay khi bạn gõ và liệt kê kèm vị trí cùng các nhóm bắt. Mẫu chạy trên chính bộ máy regex JavaScript của trình duyệt, nên kết quả giống hệt trong mã của bạn và văn bản luôn nằm trên thiết bị của bạn.
0 ký tự · 0 từ · 0 dòng
Các kết quả khớp được tô sáng tại đây.0 ký tự · 0 từ · 0 dòng
Chạy hoàn toàn trong tab trình duyệt này. Văn bản của bạn không bao giờ được tải lên hay lưu trữ.
Các token regex trong JavaScript
Cột kết quả khớp đầu tiên được tạo bằng cách chạy từng mẫu trên văn bản tương ứng với chính engine JavaScript đã tạo trang này.
| Token | Ý nghĩa | Mẫu | Văn bản | Kết quả khớp đầu tiên |
|---|---|---|---|---|
\d | Chữ số 0–9 | /\d+/ | Order 66 shipped | 66 |
\w | Chữ cái, chữ số hoặc dấu gạch dưới (ASCII) | /\w+/ | snake_case-id | snake_case |
\s | Khoảng trắng, bao gồm tab và dấu xuống dòng | /\s+/ | two spaces | |
. | Bất kỳ ký tự nào trừ dấu xuống dòng (trừ khi có s) | /a.c/ | abc a-c | abc |
^ $ | Đầu và cuối đầu vào (hoặc dòng, khi có m) | /^\w+$/ | single | single |
[abc] | Một trong các ký tự được liệt kê | /[aeiou]/ | rhythm and blues | a |
[^abc] | Bất kỳ ký tự nào không được liệt kê | /[^0-9]+/ | 2026-10-18 | - |
* + ? | 0 lần trở lên, 1 lần trở lên, 0 hoặc 1 lần | /colou?r/ | color colour | color |
{n,m} | Từ n đến m lần | /\d{2,4}/ | 7 42 1999 123456 | 42 |
(…) | Nhóm bắt giữ | /(\d+)px/ | width: 320px | 320px |
(?<name>…) | Nhóm bắt giữ có tên | /(?<h>\d\d):(?<m>\d\d)/ | at 09:45 | 09:45 |
(?:…) | Nhóm không bắt giữ | /(?:ab)+/ | ababab! | ababab |
a|b | Một trong hai vế | /cat|dog/ | hotdog | dog |
\b | Ranh giới từ | /\bcat\b/ | concat cat | cat |
(?=…) | Theo sau bởi (lookahead) | /\d+(?=%)/ | 50 of 75% | 75 |
(?<!…) | Không đứng sau (negative lookbehind) | /(?<!\$)\b\d+/ | $30 or 40 | 40 |
\p{L} | Bất kỳ chữ cái Unicode nào (cần u) | /\p{L}+/u | naïve 東京 | naïve |
Sáu cờ và tác dụng của từng cờ
g (global) tìm mọi kết quả khớp thay vì dừng ở kết quả đầu tiên; nếu không có cờ này, danh sách chỉ có một mục. i bỏ qua phân biệt chữ hoa, chữ thường. m (multiline) khiến ^ và $ khớp ở đầu và cuối từng dòng thay vì chỉ ở đầu và cuối toàn bộ văn bản, phù hợp với mẫu như khoảng trắng ở cuối dòng. s (dotAll, thêm vào từ ES2018) cho phép dấu . khớp cả ký tự xuống dòng. u (unicode) xử lý văn bản theo điểm mã, nên một emoji được tính là một ký tự, đồng thời bật các ký hiệu thuộc tính như \p{L} cho mọi chữ cái trong mọi hệ chữ viết. y (sticky) chỉ khớp đúng tại vị trí hiện tại, chế độ mà các trình phân tách token (tokenizer) sử dụng. JavaScript còn có cờ d để lấy chỉ số khớp và cờ v cho các phép toán tập hợp trong lớp ký tự; công cụ này chỉ dùng sáu cờ nêu trên.
Bên dưới văn bản thử, mỗi kết quả khớp hiển thị chỉ số và các nhóm của nó. Nhóm đánh số đến từ dấu ngoặc đơn thông thường, (?:…) tạo nhóm không bắt, còn (?<year>\d{4}) tạo nhóm có tên và hiển thị theo tên, như mẫu ngày ISO minh họa. Menu Mẫu thông dụng chèn các mẫu khởi đầu đã được thử nghiệm cho địa chỉ email, URL, địa chỉ IPv4, màu hex, UUID, từ lặp và khoảng trắng ở cuối dòng. Hãy xem mẫu email là phép kiểm tra nhanh, không phải xác thực: cú pháp đầy đủ của địa chỉ email rộng rãi hơn nhiều, và cách kiểm tra thật sự duy nhất là gửi thử một thư.
Lookbehind và hiện tượng backtracking thảm họa
Lookaround kiểm tra phần xung quanh một vị trí mà không tiêu thụ ký tự. Lookahead, (?=…) và (?!…), vốn đã có trong JavaScript từ lâu; lookbehind, (?<=…) và (?<!…), xuất hiện từ ES2018 và có mặt trên mọi trình duyệt lớn khi Safari 16.4 hỗ trợ vào năm 2023. Vì vậy (?<=\$)\d+ tìm thấy 42 trong "$42" mà không kèm ký hiệu đô la. Khác với nhiều engine khác, JavaScript cho phép lookbehind có độ dài bất kỳ.
Engine của JavaScript hoạt động theo kiểu quay lui: khi một nhánh thất bại, nó quay lại và thử các phương án khác. Các bộ lặp lồng nhau như (a+)+$ tạo ra số cách chia cùng một đoạn văn bản tăng theo cấp số mũ, nên chuỗi gồm 30 chữ a theo sau là chữ x có thể mất vài giây, thêm vài chữ nữa có thể mất hàng giờ. Đây là hiện tượng quay lui thảm khốc (catastrophic backtracking), và trên máy chủ nó trở thành ReDoS, một dạng tấn công từ chối dịch vụ; chỉ một quy tắc WAF mắc lỗi này đã làm mạng của Cloudflare ngừng hoạt động khoảng nửa giờ vào ngày 2 tháng 7 năm 2019. Vì công cụ này chạy ngay trong thẻ trình duyệt của bạn, mẫu như vậy có thể làm treo trang; hãy tải lại và viết lại mẫu sao cho không có hai bộ lặp nào cùng chiếm một ký tự, dùng lớp ký tự chặt hơn như [^,]* thay cho .*, hoặc dùng neo. Nếu cần chỉnh sửa chính văn bản thay vì khớp mẫu, hãy xem công cụ văn bản; các tiện ích khác dành cho lập trình viên có trong mục công cụ cho lập trình viên.
Câu hỏi thường gặp
- Vì sao regex của tôi chỉ tìm được một kết quả khớp?
- Cờ g đang tắt. Khi không có cờ này, engine dừng sau kết quả khớp đầu tiên. Hãy chọn g để liệt kê mọi kết quả; riêng cờ y cũng tìm được nhiều kết quả, nhưng chỉ khi chúng nối liền nhau.
- Trong JavaScript, \d có khớp chữ số của các hệ chữ viết khác không?
- Không. Trong JavaScript, \d chỉ là 0 đến 9 và \w chỉ gồm chữ cái ASCII, chữ số và dấu gạch dưới, kể cả khi dùng cờ u. Hãy dùng \p{Nd} hoặc \p{L} cùng cờ u cho các hệ chữ viết khác.
- Mẫu đã kiểm tra ở đây có hoạt động giống vậy trong Python hoặc PHP không?
- Cú pháp cơ bản dùng được, nhưng chi tiết khác nhau: nhóm có tên trong Python viết là
(?P<name>…), PHP và Python hỗ trợ bộ lặp chiếm hữu (possessive) mà JavaScript không có, và quy tắc lookbehind cũng khác nhau. Hãy thử lại trên engine đích. - Làm sao để khớp đúng ký tự dấu chấm hoặc dấu ngoặc?
- Hãy thoát ký tự bằng dấu gạch chéo ngược:
\.khớp dấu chấm và\[khớp dấu ngoặc vuông mở. Trong lớp ký tự, hầu hết ký hiệu đã được hiểu theo nghĩa đen, nên[.]cũng chỉ khớp dấu chấm. - Vì sao trang bị treo khi tôi đang gõ mẫu?
- Có thể mẫu của bạn đã gây ra quay lui thảm khốc trên văn bản đó. Hãy tải lại trang, rồi tránh các bộ lặp lồng nhau như
(.*)*hoặc(a+)+và làm cho mỗi phần khớp càng ít ký tự càng tốt.