🌐 VI

🔣 Trình kiểm tra Regex

Kiểm tra các mẫu biểu thức chính quy theo thời gian thực và xem kết quả khớp. Cung cấp cài đặt cờ, bắt nhóm và thư viện mẫu phổ biến.

Mẫu phổ biến

HƯỚNG DẪN

Tìm hiểu thêm

01

1. Kiến thức cơ bản về Biểu thức chính quy

Biểu thức chính quy (Regex) là công cụ mạnh mẽ để định nghĩa, tìm kiếm, trích xuất và thay thế các mẫu chuỗi. Có thể khớp theo nghĩa đen (\d cho chữ số, \w cho ký tự chữ) hoặc dùng ký tự đặc biệt cho các mẫu phức tạp. Ví dụ: ^[a-z]+$ nghĩa là chuỗi chỉ chứa chữ cái thường. ^ là đầu, $ là cuối, [a-z] là từ a đến z, + nghĩa là một hoặc nhiều. Hỗ trợ trong hầu hết ngôn ngữ lập trình và trình soạn thảo văn bản, rất cần cho kiểm tra đầu vào, phân tích dữ liệu và thay thế văn bản.

02

2. Bộ sưu tập mẫu thường dùng

Các mẫu regex dùng nhiều trong thực tế: Email: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$, Số điện thoại (Mỹ): ^(\+1)?[-.\s]?\(?[0-9]{3}\)?[-.\s]?[0-9]{3}[-.\s]?[0-9]{4}$, URL: ^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b, Ngày (YYYY-MM-DD): ^\d{4}-\d{2}-\d{2}$, Mật khẩu (tối thiểu 8 ký tự, chữ hoa+thường+số+ký tự đặc biệt): ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$. Hãy dùng các mẫu này làm nền tảng rồi chỉnh sửa theo dự án của bạn.

03

3. Giải thích cờ Regex

Cờ Regex điều khiển cách tìm kiếm hoạt động. g(global): tìm tất cả kết quả khớp, không chỉ kết quả đầu tiên. i(ignoreCase): khớp không phân biệt hoa thường (/hello/i khớp Hello, HELLO). m(multiline): ^ và $ khớp với đầu/cuối của từng dòng. s(dotAll): . khớp cả ký tự xuống dòng (\n). u(unicode): xử lý đầy đủ Unicode (emoji, v.v.). y(sticky): chỉ bắt đầu tìm tại vị trí lastIndex. Ví dụ: /hello/gi tìm tất cả hello và bỏ qua hoa thường.

04

4. Nhóm bắt và tham chiếu ngược

Dấu ngoặc () tạo ra các nhóm để bắt phần khớp và dùng lại sau này. Ví dụ: /(\d{4})-(\d{2})-(\d{2})/ trong đó $1 là năm, $2 là tháng, $3 là ngày. Mảng kết quả match() của JavaScript bao gồm cả các nhóm bắt. Tham chiếu ngược \1, \2 khớp với chính văn bản mà các nhóm trước đó đã bắt. Ví dụ: /(\w+)\s+\1/ khớp "hello hello". Nhóm không bắt (?:) nhóm lại mà không lưu kết quả, giúp hiệu năng tốt hơn.

05

5. Lookahead và Lookbehind

Lookahead và lookbehind kiểm tra mẫu trước/sau mà không đưa chúng vào kết quả khớp. Positive lookahead (?=): /\d(?=px)/ khớp chữ số đứng trước px ("100" trong "100px"). Negative lookahead (?!): /\d(?!px)/ khớp chữ số không đứng trước px. Positive lookbehind (?<=): /(?<=\$)\d+/ khớp chữ số đứng sau $ ("100" trong "$100"). Negative lookbehind (?<!): ngược lại. Thường dùng trong kiểm tra mật khẩu để xác minh có chứa ký tự cụ thể.

06

6. Tối ưu hiệu năng Regex

Regex phức tạp có thể gây vấn đề hiệu năng. Hãy cụ thể nhất có thể ([a-z]+ thay vì .*). Thay các nhóm bắt không cần thiết bằng nhóm không bắt (?:). Dùng bộ định lượng lười (*?, +?) thay vì tham lam (*,+) để giảm backtracking. Với văn bản lớn, các phương thức chuỗi (indexOf, startsWith) có thể nhanh hơn regex. Tiền biên dịch regex để tái sử dụng (đừng liên tục tạo RegExp mới). Cẩn thận với tấn công ReDoS (Regular Expression Denial of Service) - đừng bao giờ dùng trực tiếp đầu vào người dùng làm mẫu regex.

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

Tôi có thể kết hợp nhiều cờ regex không?
Có, bạn có thể bật nhiều cờ cùng lúc — ví dụ, g và i kết hợp sẽ tìm tất cả kết quả khớp trong khi bỏ qua chữ hoa chữ thường. Chỉ cần chọn những tùy chọn bạn cần và công cụ sẽ áp dụng chúng cùng nhau.
Tôi có thể dùng nguyên các mẫu phổ biến có sẵn không?
Các mẫu như email, số điện thoại, URL và ngày hoạt động tốt ngay trong hầu hết trường hợp, nhưng tốt nhất vẫn nên điều chỉnh theo nhu cầu cụ thể của dự án (ví dụ: định dạng số điện thoại theo từng quốc gia).
Tôi nên kiểm tra gì khi không có kết quả khớp?
Trước tiên hãy kiểm tra lỗi gõ trong mẫu, chỗ thoát ký tự còn thiếu (\. thay vì .), và cài đặt cờ. "No matches found" nghĩa là chính regex hợp lệ nhưng không khớp với chuỗi kiểm tra của bạn.
Nhóm bắt được phản ánh thế nào trong kết quả?
Công cụ này không liệt kê riêng giá trị của từng nhóm đã bắt. Thay vào đó, nó tô sáng mọi kết quả khớp trong chuỗi kiểm tra và hiển thị tổng số lần khớp. Bạn vẫn có thể viết nhóm bắt trong mẫu, nhưng để kiểm tra $1, $2, v.v. thực sự bắt được gì, bạn sẽ cần tự xem lại (ví dụ qua console của trình duyệt).
Vì sao các mẫu regex phức tạp chạy chậm?
Nguyên nhân thường là do bộ định lượng tham lam hoặc các nhóm lồng nhau gây backtracking quá mức. Viết mẫu cụ thể hơn và dùng bộ định lượng lười (*?, +?) thường sẽ giúp cải thiện.