Thư Viện Mẫu Biểu Thức Chính Quy

Hơn 60 mẫu regex sẵn sàng sử dụng. Tìm kiếm, sao chép và kiểm tra trực tuyến.

Về thư viện này

Đây là một bộ sưu tập có tổ chức và có thể tìm kiếm gồm hơn 60 mẫu biểu thức chính quy thường dùng, được sắp xếp theo danh mục. Mỗi mẫu bao gồm mô tả, biểu thức và các ví dụ khớp. Nhấp vào một mẫu để sao chép, hoặc sử dụng bảng kiểm tra nhanh để xác thực văn bản với nó trực tiếp trên trang này.

Mọi thứ chạy trong trình duyệt của bạn · không có mẫu hay văn bản kiểm tra nào được gửi đi. Sử dụng các mẫu này trong JavaScript, Python, PHP, Java, Go hoặc bất kỳ ngôn ngữ nào hỗ trợ biểu thức chính quy. Để kiểm tra nâng cao hơn với cờ và nhóm chụp, hãy thử Bộ Kiểm Tra & Gỡ Lỗi Biểu Thức Chính Quy của chúng tôi.

Cách hoạt động

  1. Duyệt hoặc tìm kiếm: duyệt các mẫu theo danh mục (xác thực, trích xuất, định dạng) hoặc tìm kiếm theo tên hoặc trường hợp sử dụng.
  2. Xem trước mẫu: mỗi mục hiển thị regex, mô tả về những gì nó chụp, đầu vào ví dụ với kết quả khớp và các giới hạn.
  3. Kiểm tra với dữ liệu của bạn: nhập chuỗi kiểm tra của riêng bạn để xác minh rằng mẫu chụp được những gì bạn mong đợi.
  4. Sao chép để sử dụng: sao chép mẫu regex ở định dạng JavaScript, Python hoặc POSIX cho mã của bạn.

Tại sao sử dụng thư viện regex?

Viết biểu thức chính quy từ đầu mất thời gian và dễ sai sót. Các mẫu thường cần thiết để xác thực email, khớp URL, trích xuất số điện thoại, phát hiện thẻ tín dụng, phân tích ngày tháng hoặc xác thực địa chỉ IP đã có giải pháp đã được thử nghiệm, nhưng tìm phiên bản đáng tin cậy đòi hỏi tìm kiếm trên Stack Overflow, đánh giá tính chính xác của nó và xác minh các trường hợp biên. Thư viện này tập hợp các mẫu đã được xác minh với các trường hợp biên được ghi lại, các giới hạn đã biết và các trường hợp kiểm thử cụ thể. Nó nhanh hơn việc tự viết và đáng tin cậy hơn việc sao chép-dán từ các nguồn Internet ngẫu nhiên không có kiểm thử.

Danh mục mẫu

Biểu thức chính quy đến từ đâu

Ý tưởng toán học về «tập hợp chính quy» được hình thức hóa bởi Stephen Cole Kleene vào năm 1951 trong bản ghi nhớ nghiên cứu RAND Representation of Events in Nerve Nets and Finite Automata. Toán tử * trên trang này vẫn được gọi là sao Kleene để tôn vinh ông. Ken Thompson đã biến lý thuyết thành thuật toán trong bài báo tháng 6 năm 1968 trên Communications of the ACM, Programming Techniques: Regular Expression Search Algorithm, và phát hành cài đặt regex đầu tiên trong trình soạn thảo QED tại Bell Labs. Đến năm 1973, cùng một engine cung cấp năng lượng cho ed, sau đó là grep (mở rộng theo nghĩa đen là «globally search for regular expression and print»), sed, và awk. Perl (1987) của Larry Wall và đặc biệt là Perl 5 (1994) đã thêm các nhóm có tên, lookaround, lượng từ không tham lam và xử lý Unicode, trở thành phương ngữ trên thực tế được gọi là PCRE, được chuyển sang C dưới dạng thư viện bởi Philip Hazel vào năm 1997.

Các biến thể engine và những gì thay đổi giữa chúng

Một mẫu chạy sạch trong JavaScript có thể thất bại lặng lẽ trong Go và bị từ chối hoàn toàn trong POSIX. Năm biến thể mà một nhà phát triển có khả năng gặp nhất:

Backtracking thảm khốc và ReDoS

Hầu hết các engine regex trong các ngôn ngữ chính (PCRE, Java, JS V8 / SpiderMonkey / JavaScriptCore, Python re, .NET) là các engine backtracking. Khi một mẫu với lượng từ lồng nhau như (a+)+ gặp đầu vào gần khớp, engine có thể thử số lượng đường dẫn thay thế theo cấp số nhân trước khi bỏ cuộc. Đây là backtracking thảm khốc, và là cơ sở của lớp tấn công ReDoS (Regular expression Denial of Service) được liệt kê bởi OWASP.

Stack Overflow, 20 tháng 7 năm 2016: một mẫu được thiết kế để cắt khoảng trắng đầu và cuối, áp dụng cho nội dung câu hỏi chứa 20 000 ký tự khoảng trắng liên tiếp, mất 11 phút CPU cho mỗi yêu cầu và khiến trang web không phản hồi trong 34 phút. Báo cáo sự cố trên blog chính thức Stack Status khuyến nghị thay thế regex cắt bằng trim chuỗi gốc.

Cloudflare, 2 tháng 7 năm 2019: một quy tắc WAF chứa mẫu lượng từ lồng nhau .*(?:.*=.*) đã được triển khai toàn cầu và tiêu thụ 100% CPU trên mỗi máy chủ biên trong 27 phút, đưa các phần lớn của internet công cộng offline. Báo cáo sự cố của Cloudflare trên blog của họ ghi nhận việc chuyển sang crate regex của Rust (một engine dựa trên RE2, thời gian tuyến tính) để ngăn chặn tái diễn.

Bài học phòng thủ: tránh lượng từ lồng nhau ((a+)+, (a*)*, (a|aa)+); tránh cắt kiểu \s+$ trên đầu vào do kẻ tấn công kiểm soát; ưu tiên nhóm nguyên tử (?>...) hoặc lượng từ sở hữu a++ trong PCRE; và đối với dịch vụ thông lượng cao, hãy xem xét engine dựa trên RE2.

Email, URL, điện thoại, ngày, thẻ tín dụng: khi không dùng regex

Email. Toàn bộ ngữ pháp của RFC 5322 (tháng 10 năm 2008) biên dịch thành regex khoảng 3 000 ký tự. Đặc tả HTML5 của W3C cho xác thực <input type="email"> sử dụng regex ngắn hơn nhiều «liệu-đây-có-vẻ-là-email» là điểm khởi đầu đúng cho các gợi ý phía máy khách. RFC 6531 (tháng 2 năm 2012) cho phép các địa chỉ không phải ASCII như 用户@example.com, mà regex chỉ ASCII sẽ từ chối sai. Đồng thuận của ngành kể từ RFC 6532: không xác thực email bằng regex, gửi email xác minh thay vào đó.

URL. RFC 3986 (tháng 1 năm 2005) là đặc tả cú pháp URI chung, nhưng WHATWG URL Living Standard cố ý khác biệt với nó để phù hợp với những gì trình duyệt thực sự chấp nhận. Sử dụng new URL("...") trong JavaScript hoặc urllib.parse trong Python thay vì regex cho bất cứ điều gì ngoài kiểm tra thị giác nhanh.

Số điện thoại. Khuyến nghị E.164 của ITU-T (sửa đổi hiện tại tháng 11 năm 2010) cho phép tối đa 15 chữ số với tiền tố + tùy chọn, nhưng các quy tắc cụ thể của quốc gia thay đổi rất nhiều. Thư viện mã nguồn mở của Google libphonenumber mã hóa các quy tắc theo quốc gia cho từng lãnh thổ và là trình xác thực đáng tin cậy duy nhất giữa các quốc gia.

Ngày. Một regex như ^\d{4}-\d{2}-\d{2}$ khớp với định dạng lịch ISO 8601-1:2019, nhưng nó cũng chấp nhận 2026-02-31. Tính hợp lệ của ngày yêu cầu logic lịch, không phải khớp mẫu; sử dụng Date.parse() hoặc thư viện ngày.

Thẻ tín dụng. Một regex có thể khớp với độ dài chữ số và tiền tố IIN (Visa bắt đầu bằng 4, Mastercard bằng 51-55 hoặc 2221-2720, Amex bằng 34 hoặc 37) nhưng không thể xác minh kiểm tra Luhn (Hans Peter Luhn, IBM, Bằng sáng chế Hoa Kỳ 2 950 048 được cấp tháng 8 năm 1960). Luhn yêu cầu tổng từng chữ số modulo 10.

Các cách phổ biến mà nhà phát triển sử dụng thư viện này

Những sai lầm phổ biến

Thêm câu hỏi thường gặp

Tại sao một số mẫu sử dụng (?:...) thay vì (...)?

(?:...) là một nhóm không bắt: nó nhóm để lặp lại hoặc thay thế nhưng không phân bổ khe backreference. Nó nhanh hơn và tránh làm ô nhiễm $1, $2 trong mảng kết quả. Sử dụng (...) khi bạn cần trích xuất văn bản đã bắt; sử dụng (?:...) chỉ để nhóm.

Các flag regex phổ biến nhất là gì?

i không phân biệt chữ hoa chữ thường, g toàn cầu (tìm tất cả, hành vi đặc thù JS), m nhiều dòng (để ^$ khớp với ranh giới dòng), s dotAll (để . khớp với dòng mới, ES2018+), u Unicode (ES2015+), y sticky (ES2015+), d hasIndices (ES2022+), v các lớp ký hiệu tập hợp (ES2024+). Kết hợp dưới dạng /pattern/gimsu.

Làm thế nào để khớp một ký tự đặc biệt theo nghĩa đen?

Thoát nó bằng dấu gạch chéo ngược. Các siêu ký tự regex cần thoát để khớp theo nghĩa đen là: . ^ $ * + ? ( ) [ ] { } | \ /. Bên trong một lớp ký tự [...] tập hợp các ký tự đặc biệt nhỏ hơn: chỉ ] \ ^ - cần thoát, tùy thuộc vào vị trí.

Tôi có thể sử dụng các mẫu của thư viện này trong script shell không?

Có, với các lưu ý. grep sử dụng POSIX BRE theo mặc định; grep -E sử dụng ERE; grep -P sử dụng PCRE trên các hệ thống nơi libpcre được liên kết (GNU grep, macOS grep với Homebrew). Các mẫu sử dụng lookaround, nhóm có tên hoặc escape Unicode yêu cầu grep -P hoặc ripgrep (sử dụng engine RE2-based của Rust và từ chối lookaround).

Các mẫu này có được gửi đến máy chủ không?

Không. Mỗi regex trên trang này, mỗi tìm kiếm bạn nhập và mỗi chuỗi bạn kiểm tra trong bảng kiểm tra nhanh được xử lý trong engine JavaScript của trình duyệt của bạn. Không có cuộc gọi mạng nào được thực hiện. Dữ liệu mẫu bản thân được phát hành dưới dạng tệp JSON tĩnh trong bundle trang. Mở tab Mạng trong DevTools để xác minh.

Công cụ liên quan