RevealTheme logo

Trình kiểm thử biểu thức chính quy

Kiểm thử các biểu thức chính quy JavaScript trên bất kỳ đầu vào nào. Xem các kết quả khớp, nhóm và phép thay thế theo thời gian thực.

0 kết quả khớp

Biểu thức chính quy là gì và làm thế nào để đọc chúng?

Biểu thức chính quy (regex) là một ngôn ngữ nhỏ chuyên biệt theo lĩnh vực dùng để tìm kiếm các mẫu trong văn bản. Mọi ngôn ngữ lập trình hiện đại đều có một bộ máy regex; công cụ này dùng RegExp gốc của JavaScript, vốn tuân theo đặc tả ECMAScript 2018+ và hỗ trợ các tính năng hiện đại như khẳng định lookbehind, nhóm bắt có tên, escape thuộc tính Unicode và cờ dotAll. Các khối cơ bản: các ký tự nguyên văn khớp với chính nó (regex 'gato' khớp với từ gato); các lớp ký tự khớp với bất kỳ ký tự nào trong một tập hợp ('[a-z]' khớp với chữ thường); các bộ định lượng kiểm soát sự lặp lại (* không hoặc nhiều, + một hoặc nhiều, ? không hoặc một, {3,5} từ 3 đến 5); các neo khớp với vị trí (^ đầu chuỗi, $ cuối chuỗi, \b ranh giới từ); các nhóm bắt các kết quả khớp con ((gato|perro) khớp với bất kỳ cái nào, bắt được cái nào khớp); phép thay phiên cho phép lựa chọn. Regex tỏa sáng khi phân tích văn bản có cấu trúc nhưng không theo ngữ pháp (nhật ký, email, số điện thoại, thuộc tính HTML đơn giản) và thất bại với các cấu trúc thực sự đệ quy (HTML hoàn chỉnh, JSON lồng nhau). Với những trường hợp đó, hãy dùng một trình phân tích cú pháp. Trình kiểm thử này cho phép bạn lặp đi lặp lại trên một mẫu với phản hồi tức thì: thay đổi regex và các kết quả khớp được tính lại sau mỗi lần gõ phím.

Các trường hợp sử dụng phổ biến

  • Xác thực định dạng đầu vào của người dùng (email, số điện thoại, mã bưu chính) trước khi gửi đến máy chủ của bạn.

  • Trích xuất dữ liệu có cấu trúc từ tệp nhật ký (dấu thời gian, IP, mã trạng thái, đường dẫn yêu cầu).

  • Tìm-và-thay thế trên hàng trăm tệp bằng tính năng tìm kiếm regex của trình soạn thảo.

  • Viết quy tắc ghi lại URL cho Nginx, Apache .htaccess, hoặc rewrite của Vercel.

  • Phân tích các định dạng giống CSV đơn giản mà dùng trình phân tích thực sự là quá mức cần thiết.

  • Xây dựng mẫu xác thực biểu mẫu cho thuộc tính HTML <input pattern="...">.

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

Những cờ nào được hỗ trợ?
g (global: tìm tất cả các kết quả khớp, không chỉ kết quả đầu tiên), i (không phân biệt chữ hoa chữ thường), m (multiline: ^ và $ khớp với các ngắt dòng), s (dotAll: . khớp với các ngắt dòng), u (unicode: xử lý đúng các ký tự nhiều byte), y (sticky: chỉ khớp tại lastIndex). Kết hợp các cờ bằng cách nối chúng lại: 'gim' kích hoạt global + không phân biệt chữ hoa chữ thường + multiline.
Làm thế nào để khớp trên nhiều dòng?
Hai nhu cầu khác nhau: 'm' làm cho ^ và $ khớp với các ngắt dòng (xử lý mỗi dòng như một chuỗi riêng biệt đối với các neo). 's' làm cho . khớp với các ngắt dòng (nếu không, . khớp với mọi thứ trừ các ngắt dòng). Hãy dùng cả hai cùng nhau nếu bạn cần khớp với các mẫu trải dài qua nhiều dòng.
Sự khác biệt giữa bộ định lượng tham lam và lười biếng là gì?
Các bộ định lượng tham lam (*, +, {n,m}) khớp với nhiều nhất có thể. Các bộ định lượng lười biếng (*?, +?, {n,m}?) khớp với ít nhất có thể. Ví dụ kinh điển: regex '<.*>' trên '<a><b>' khớp với toàn bộ '<a><b>'; '<.*?>' chỉ khớp với '<a>'.
Khi nào tôi KHÔNG nên dùng regex?
Khi cấu trúc thực sự là đệ quy (HTML, JSON, các dấu ngoặc cân bằng). Khi bạn cần xử lý đúng mọi trường hợp biên (phân tích ngày tháng có múi giờ, tên có dấu nháy đơn). Khi ngữ pháp của đầu vào được định nghĩa rõ ràng và đã tồn tại một thư viện phân tích cú pháp. Câu trả lời nổi tiếng trên Stack Overflow: regex tuyệt vời để tìm mẫu, tệ hại để phân tích ngôn ngữ.
Nhóm bắt có tên là gì?
Thay vì để (\d{4})-(\d{2})-(\d{2}) trả về các nhóm được đánh số, hãy dùng (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2}) và truy cập các kết quả khớp dưới dạng match.groups.year. Dễ bảo trì hơn nhiều trong mã thực tế.
Tại sao regex của tôi chậm với một số đầu vào nhất định?
Quay lui thảm họa. Các bộ định lượng lồng nhau như (a+)+ có thể mất thời gian theo cấp số mũ với các đầu vào đối kháng. Hãy tránh các bộ định lượng lồng nhau và các phép thay phiên chồng chéo. Bộ máy JavaScript không có thời gian chờ, nên một regex tệ có thể làm treo một yêu cầu. Đối với môi trường production, hãy dùng gói npm safe-regex để phát hiện các mẫu rủi ro.
Cái này có khớp với những gì bộ máy regex trên máy chủ của tôi làm không?
Phần lớn là có: các biến thể regex chính (PCRE, re của Python, regex của Ruby, Java) tương tự nhau nhưng có những khác biệt tinh tế. Cú pháp lookbehind, hành vi của các lớp ký tự và cách xử lý Unicode khác nhau. Để có sự tương đồng trong production, hãy kiểm thử cả trên ngôn ngữ đích.

Công cụ liên quan