Kiểm tra biểu thức chính quy (regex)

Thử regex JavaScript trực tiếp: chuỗi khớp, nhóm bắt và xem trước thay thế.

Cú pháp JavaScript (ECMAScript), viết không kèm dấu gạch chéo.

Cờ

Dùng $1, $<tên>, $& cho toàn bộ chuỗi khớp và $$ cho dấu đô la.

Kết quả khớp

Nhập biểu thức để xem kết quả khớp.

Công cụ này làm gì

Biểu thức chính quy (regex) là một mẫu ngắn mô tả một tập chuỗi, ví dụ "bốn chữ số, dấu gạch ngang, hai chữ số" hay "mọi thứ nằm giữa hai dấu ngoặc góc". Công cụ này thử mẫu trên văn bản của bạn ngay khi bạn gõ: tô sáng từng chuỗi khớp, liệt kê vị trí, cho biết mỗi nhóm bắt lấy được gì và xem trước kết quả thay thế như $2, $1. Không có gì bạn dán vào bị tải lên, việc tìm kiếm chạy ngay trong trình duyệt.

Công cụ dùng bộ máy regex của chính trình duyệt, tức là cú pháp JavaScript (ECMAScript). Đây là lựa chọn đúng khi mẫu sẽ chạy trong JavaScript, TypeScript hoặc Node.js. Python, PHP hay Java có vài khác biệt nhỏ, nên hãy kiểm tra lại các tính năng đặc thù trong tài liệu của ngôn ngữ đó.

Cách dùng

  1. Gõ mẫu vào ô đầu tiên, không kèm dấu gạch chéo bao quanh. \d{4}-\d{2} là mẫu; /\d{4}-\d{2}/g là cách viết trong mã nguồn.
  2. Bật các cờ cần dùng. Cờ g được bật sẵn để tìm mọi chuỗi khớp chứ không chỉ chuỗi đầu tiên.
  3. Dán hoặc gõ văn bản thử. Các chuỗi khớp được tô bằng hai màu xen kẽ để hai chuỗi liền nhau vẫn phân biệt được.
  4. Đọc bảng bên dưới: mỗi chuỗi khớp kèm vị trí bắt đầu và kết thúc, và mỗi nhóm bắt một dòng. Nhóm không tham gia khớp được ghi rõ, khác với nhóm khớp chuỗi rỗng.
  5. Muốn viết lại văn bản, điền vào ô "Thay bằng". Quy tắc giống String.prototype.replace: $1 là nhóm số 1, $<tên> là nhóm đặt tên, $& là toàn bộ chuỗi khớp và $$ là dấu đô la.

Các cờ

Cờ i bỏ qua hoa thường, m làm ^ và $ khớp ở mỗi đầu và cuối dòng, s cho dấu chấm khớp cả ký tự xuống dòng, u đọc văn bản theo điểm mã Unicode (biểu tượng cảm xúc tính là một ký tự), v là phiên bản chặt chẽ hơn của u và y chỉ khớp đúng tại điểm bắt đầu tìm. Vị trí được đếm theo đơn vị UTF-16 của JavaScript, bắt đầu từ 0.

Ví dụ

Với văn bản 2026-10-13 và mẫu (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2}), công cụ tìm thấy một chuỗi khớp ở vị trí 0, dài 10 ký tự, với ba nhóm: 2026, 10 và 13. Đặt "Thay bằng" là $<day>/$<month>/$<year> sẽ ra 13/10/2026. Một ví dụ khác: trên <b>đậm</b> và <i>nghiêng</i>, mẫu <.+> khớp cả chuỗi vì .+ lấy nhiều nhất có thể, còn <.+?> chỉ khớp từng thẻ riêng.

Vì sao mẫu có thể bị treo

Một số mẫu chạy lâu gấp đôi sau mỗi ký tự thêm vào, gọi là quay lui thảm họa (catastrophic backtracking). Ví dụ kinh điển là ^(a+)+$ trên một chuỗi dài toàn chữ a rồi đến chữ b. Trong ứng dụng web, đây là rủi ro từ chối dịch vụ (ReDoS). Trang này chạy tìm kiếm trong worker nền và tự dừng sau 2 giây, nên tab không bị đơ. Cách sửa thường là bỏ phần lặp lồng nhau: ^a+$ cho cùng kết quả gần như tức thì.

Lỗi thường gặp

  • Quên thoát ký tự đặc biệt: dấu chấm khớp mọi ký tự, muốn khớp dấu chấm thật phải viết \..
  • Mong ^ và $ khớp theo từng dòng mà không bật cờ m.
  • Quên cờ g khi thay thế nên chỉ chuỗi đầu tiên bị đổi.
  • Dán cả dấu gạch chéo và cờ như /ab+c/gi. Chỉ gõ phần giữa hai dấu gạch chéo và dùng các nút cờ.

Để xem phần thay thế đã đổi gì, hãy dán hai bản vào so sánh văn bản. Nếu bạn cần đặt lịch chạy thay vì tìm chuỗi, giải thích cron sẽ đọc lịch bằng lời.

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

Công cụ dùng loại regex nào?

Cú pháp JavaScript (ECMAScript) của chính trình duyệt bạn. Nó phù hợp với JavaScript, TypeScript và Node.js. Với Python, PHP, Java hay .NET, phần lớn mẫu thông thường chạy được nhưng hãy kiểm tra các tính năng đặc thù.

Văn bản của tôi có bị tải lên không?

Không. Mẫu và văn bản nằm trong trình duyệt và được xử lý bởi worker nền trên thiết bị của bạn, không gửi gì qua mạng.

Vì sao mẫu của tôi bị dừng sau 2 giây?

Nhiều khả năng mẫu bị quay lui thảm họa: các phép lặp lồng nhau như (a+)+ trên văn bản dài khiến bộ máy thử số đường đi tăng theo hàm mũ. Công cụ dừng lại để trang vẫn dùng được. Hãy đơn giản hóa mẫu hoặc giới hạn số lần lặp.

Vì sao vị trí khác với trình soạn thảo của tôi?

Vị trí ở đây là chỉ số chuỗi của JavaScript, tính theo đơn vị UTF-16 từ 0. Ký tự ngoài mặt phẳng cơ bản như biểu tượng cảm xúc chiếm hai đơn vị, còn trình soạn thảo có thể đếm theo dòng và cột.