Regex Tester

Gõ pattern và thấy kết quả ngay lập tức — được tô màu, phân nhóm và giải thích. Chạy engine regex của Rust ngay trong trình duyệt: văn bản và pattern của bạn không bao giờ rời khỏi máy.

File không bao giờ rời khỏi thiết bị của bạn
0

Kiểm Tra Biểu Thức Chính Quy Trực Tiếp, Riêng Tư

Gõ một mẫu và một chuỗi kiểm tra, kết quả khớp sẽ được tô sáng ngay khi bạn gõ — không cần nút gửi, không cần gửi dữ liệu đến server. Mọi thứ chạy phía client trên bản build WebAssembly của các engine regex Rust, nên văn bản và mẫu của bạn luôn ở lại trên thiết bị.

Nút Copy link đóng gói mẫu, cờ và chuỗi kiểm tra của bạn vào phần hash của URL (phần sau dấu #). Trình duyệt không bao giờ gửi phần hash của URL lên server khi tải trang, nên một link được chia sẻ vẫn giữ dữ liệu của bạn ở phía người mở link — không có gì được gửi qua lại với chúng tôi theo bất kỳ chiều nào.

Cách Sử Dụng Công Cụ Này

  1. Viết mẫu regex — Gõ hoặc dán một biểu thức chính quy vào ô Pattern. Lỗi cú pháp được báo ngay khi bạn gõ.
  2. Thiết lập cờ — Bật i (không phân biệt hoa thường), m (mốc dòng nhiều dòng), s (dấu chấm khớp cả xuống dòng) và x (verbose, bỏ qua khoảng trắng và cho phép chú thích #) để thay đổi cách mẫu được diễn giải.
  3. Thêm chuỗi kiểm tra — Dán văn bản trực tiếp, hoặc dùng "Load from file" cho đầu vào lớn hơn. Kết quả khớp, các nhóm và vị trí của chúng được tô sáng ngay lập tức.
  4. Khám phá các tabMatch hiển thị từng kết quả khớp cùng các nhóm đánh số và nhóm có tên; Replace viết lại văn bản theo một mẫu thay thế; List trích ra chỉ riêng các giá trị khớp, mỗi giá trị một dòng; Explain phân tích mẫu từng phần bằng ngôn ngữ tự nhiên.
  5. Chia sẻ hoặc xuất — Sao chép một permalink tái tạo chính xác mẫu, cờ và chuỗi kiểm tra của bạn, hoặc sao chép trực tiếp kết quả thay thế/danh sách.

Linear-Time Theo Thiết Kế

Phần lớn các công cụ regex dùng engine backtracking, có thể mất thời gian tăng theo cấp số nhân với đầu vào ác ý — đây chính là vấn đề ReDoS (Regular Expression Denial of Service) kinh điển, nơi một mẫu chứa các định lượng lồng nhau có thể làm treo trang hoặc server trong nhiều giây hay nhiều phút chỉ với một chuỗi ngắn được thiết kế cố ý.

Công cụ này tránh vấn đề đó bằng cách mặc định dùng engine regex linear-time của Rust bất cứ khi nào mẫu cho phép. Engine này đảm bảo thời gian khớp tăng tỉ lệ thuận với độ dài đầu vào — không bao giờ theo cấp số nhân — bất kể mẫu trông như thế nào. Với phần lớn các mẫu (lớp ký tự, định lượng, luân phiên, nhóm, mốc neo), đây chính là engine chạy, và huy hiệu bên cạnh ô pattern sẽ hiển thị "Linear-time" để xác nhận điều đó.

Có hai cấu trúc nằm ngoài khả năng biểu diễn của engine linear-time: lookaround (lookahead/lookbehind) và backreference. Khi mẫu của bạn dùng một trong hai, công cụ tự động chuyển sang engine bounded backtracking — vẫn hoạt động đầy đủ, nhưng có mức trần cứng về số bước backtrack. Nếu một mẫu có vấn đề đáng lẽ sẽ chạy mãi không dừng, nó sẽ dừng lại với thông báo lỗi rõ ràng thay vì làm treo tab trình duyệt của bạn. Khi đó huy hiệu sẽ hiển thị "Bounded backtracking" để bạn luôn biết engine nào đã biên dịch mẫu của mình và vì sao.

Bảng Tham Chiếu Cờ

Công cụ tuân theo ngữ nghĩa cờ regex của Rust:

CờTênHiệu ứng
ikhông phân biệt hoa thườngKhớp chữ cái bất kể hoa hay thường
mmulti-line^$ khớp ở đầu/cuối mỗi dòng, không chỉ toàn bộ chuỗi
sdot-matches-all. khớp cả ký tự xuống dòng (bình thường thì không)
xverbose/extendedKhoảng trắng trong mẫu bị bỏ qua và # bắt đầu một chú thích, giúp bạn định dạng mẫu phức tạp dễ đọc hơn

Các cờ có thể kết hợp tự do — ví dụ im cùng lúc cho khớp không phân biệt hoa thường và nhiều dòng.

Chế Độ Replace Và List

Tab Replace viết lại chuỗi kiểm tra của bạn theo một mẫu thay thế trong khối mã như sau:

$1-$2

Các nhóm đánh số được tham chiếu bằng $1, $2, v.v. theo thứ tự khớp. Các nhóm có tên định nghĩa bằng cú pháp dấu hỏi-P kèm tên được tham chiếu bằng dạng dấu-đô-la-ngoặc-nhọn:

${name}

Tab List loại bỏ phần văn bản xung quanh và chỉ hiển thị các chuỗi con khớp, mỗi chuỗi một dòng — hữu ích khi bạn muốn lấy ra mọi địa chỉ email, URL hoặc ID trong một khối văn bản mà không cần viết mẫu thay thế.

Tab Explain

Cú pháp regex khá rối rắm, và ngay cả một mẫu do chính bạn viết cũng có thể khó đọc lại sau vài tuần. Tab Explain duyệt qua mẫu của bạn từng token một — lớp ký tự, định lượng, nhóm, mốc neo và cờ — dưới dạng một cây giải thích bằng ngôn ngữ tự nhiên, giúp bạn xác nhận mẫu thực sự làm đúng điều bạn mong muốn trước khi dựa vào nó trong code.

Kết Hợp Với Các Định Dạng Văn Bản Khác

Nếu công việc regex của bạn thực chất là xử lý dữ liệu có cấu trúc thay vì văn bản tự do, JSON Formatter là điểm dừng tiếp theo tự nhiên — công cụ này kiểm tra hợp lệ, định dạng đẹp và cho phép truy vấn JSON trực tiếp trên trình duyệt theo cùng cách tiếp cận không tải lên như ở đây.

Câu hỏi thường gặp

Văn bản hoặc mẫu regex của tôi có bị tải lên server không?
Không. Toàn bộ quá trình khớp diễn ra trong trình duyệt của bạn, chạy trên bản build WebAssembly của các engine regex Rust — mẫu và chuỗi kiểm tra của bạn không rời khỏi thiết bị. Nếu bạn dùng link chia sẻ, mẫu regex được đóng gói vào phần hash của URL, phần mà trình duyệt không bao giờ gửi lên server, nên ngay cả khi chia sẻ link, dữ liệu vẫn chỉ nằm ở phía người mở link.
Điều gì khiến công cụ này an toàn trước ReDoS (backtracking thảm khốc)?
Phần lớn các mẫu chạy trên engine linear-time, nơi thời gian khớp tăng tỉ lệ thuận với độ dài đầu vào, nên tình trạng backtracking chạy mãi không dừng là không thể xảy ra dù mẫu được viết thế nào. Chỉ khi mẫu cần lookaround hoặc backreference thì công cụ mới chuyển sang engine backtracking, và engine dự phòng này bị giới hạn bởi một mức trần số bước backtrack, nên một mẫu có vấn đề sẽ dừng lại với thông báo lỗi thay vì làm treo tab trình duyệt của bạn.
Vì sao mẫu của tôi hiển thị "Bounded backtracking" thay vì "Linear-time"?
Nhãn đó phản ánh engine nào thực sự đã biên dịch mẫu của bạn. Lookahead, lookbehind và backreference nằm ngoài khả năng biểu diễn của engine linear-time, nên các cấu trúc này được chuyển sang một engine backtracking riêng có mức trần số bước cứng. Mọi cấu trúc khác đều biên dịch trên engine linear-time và được gắn nhãn tương ứng.
Có giới hạn về dung lượng đầu vào hoặc số lượng kết quả khớp không?
Có. Chuỗi kiểm tra bị giới hạn tối đa 10 MB, và bảng kết quả khớp hiển thị tối đa 5.000 kết quả; vượt quá mức đó, một thông báo rút gọn sẽ cho bạn biết còn nhiều kết quả khớp khác. Cả hai giới hạn đều nhằm giữ cho tab trình duyệt phản hồi mượt mà, chứ không phải để hạn chế chức năng — hầu hết các trường hợp thực tế đều nằm dưới xa các mức này.
Công cụ có hỗ trợ nhóm bắt giữ có tên không?
Có. Bọc một nhóm bằng cú pháp dấu hỏi-P kèm tên trong ngoặc đơn để định nghĩa nhóm có tên, và giá trị của nó sẽ hiển thị kèm tên trong tab Match bên cạnh các nhóm đánh số. Nhóm có tên cũng hoạt động ở chế độ Replace bằng cách tham chiếu dạng dấu-đô-la-ngoặc-nhọn.
Công cụ dùng cú pháp regex nào?
Công cụ dùng ngữ nghĩa của crate regex trong Rust, khá gần với PCRE cho các mẫu thông thường nhưng không hỗ trợ lookaround hay backreference trên nhánh linear-time. Hai cấu trúc đó được xử lý bởi engine backtracking có giới hạn nói trên, nên cả hai kiểu mẫu đều hoạt động — bạn chỉ nhận được nhãn chính xác cho biết engine nào đang chạy.