Cách dùng Regex Tester
- Nhập mẫu của bạn vào giữa hai dấu gạch chéo, không kèm
/ bao quanh. - Bật/tắt các cờ như
g (mọi kết quả khớp), i (bỏ qua hoa thường) và m (nhiều dòng). - Dán văn bản kiểm thử. Kết quả khớp được tô sáng bên phải và liệt kê kèm vị trí và nhóm bắt bên dưới.
- Đánh dấu Thay thế và nhập chuỗi thay thế như
$1 hoặc $<name> để xem trước String.replace. - Chọn một mẫu từ Thư viện mẫu để bắt đầu từ regex email, URL, IP hoặc ngày tháng đã được kiểm chứng.
Biểu thức chính quy JavaScript
Công cụ này dùng chính engine RegExp của trình duyệt, nên kết quả đúng như những gì String.match, matchAll, replace và RegExp.exec trả về trong JavaScript và Node.js. Bao gồm cả cú pháp hiện đại: nhóm có tên (?<name>…), lookbehind (?<=…), Unicode property escape như \p{L} với cờ u, và chỉ số kết quả khớp với cờ d.
Các cờ làm gì
| Cờ | Tên | Tác dụng |
g | global | Tìm mọi kết quả khớp thay vì dừng ở kết quả đầu tiên. |
i | ignoreCase | Chữ cái khớp bất kể hoa hay thường. |
m | multiline | ^ và $ khớp ở đầu và cuối mỗi dòng. |
s | dotAll | . khớp cả ký tự xuống dòng. |
u | unicode | Xử lý mẫu theo code point; cho phép \p{…} và \u{…}. |
y | sticky | Chỉ khớp tại vị trí lastIndex hiện tại. |
d | hasIndices | Báo vị trí bắt đầu và kết thúc của từng nhóm bắt. |
Bảo vệ khỏi catastrophic backtracking
Mẫu có lượng từ lồng nhau, như (a+)+$ hoặc (\w|\d)*x, có thể mất thời gian theo cấp số mũ với đầu vào gần khớp. Trên một trang web thông thường điều đó làm treo tab. Ở đây mỗi lần so khớp chạy trong một Web Worker nền và bị dừng sau một giây, bạn nhận được cảnh báo rõ ràng thay vì trình duyệt bị treo. Cùng mẫu đó trong mã production có thể là lỗ hổng ReDoS, nên hãy coi cảnh báo là lỗi cần sửa.
Mẹo viết regex tốt hơn
- Neo mẫu bằng
^ và $ khi kiểm tra toàn bộ giá trị, nếu không thì chỉ cần khớp ở bất kỳ đâu trong chuỗi là qua.
- Ưu tiên lớp ký tự cụ thể như
[^"]* thay vì .*; chúng nhanh hơn và tránh khớp quá mức.
- Dùng nhóm không bắt
(?:…) khi bạn không cần giá trị được bắt.
- Đặt tên cho nhóm.
match.groups.year dễ đọc hơn match[1].
Câu hỏi thường gặp
Công cụ này dùng loại regex nào?
JavaScript (ECMAScript), thông qua RegExp có sẵn của trình duyệt. Phần lớn cú pháp giống PCRE, Python và Java, nhưng các tính năng như possessive quantifier, atomic group và modifier nội tuyến như (?i) không có trong JavaScript.
Vì sao mẫu của tôi chỉ tìm được một kết quả?
Không có cờ g (global), JavaScript dừng sau kết quả khớp đầu tiên. Bật g để tìm mọi lần xuất hiện.
Làm sao tham chiếu nhóm trong chuỗi thay thế?
Dùng $1, $2… cho nhóm đánh số, $<name> cho nhóm có tên, $& cho toàn bộ kết quả khớp và $$ cho ký tự đô la thực.
Vì sao công cụ dừng vì quá thời gian?
Mẫu mất hơn một giây với đầu vào của bạn, điều này hầu như luôn có nghĩa là catastrophic backtracking. Hãy tìm lượng từ lồng nhau như (x+)+ hoặc các lựa chọn chồng lấn như (a|a)* và viết lại để mỗi ký tự chỉ có thể được khớp theo một cách.
Dữ liệu test của tôi có bị gửi đi đâu không?
Không. Việc so khớp chạy cục bộ trong một Web Worker bên trong trình duyệt. Mẫu và văn bản của bạn chỉ được lưu trong trình duyệt của chính bạn để vẫn còn đó khi bạn quay lại.