Trình kiểm tra Regex là gì?
Regex, hay biểu thức chính quy, là cách mô tả một quy tắc tìm kiếm trong chuỗi văn bản. Quy tắc có thể kết hợp ký tự thông thường với ký hiệu đặc biệt để nhận diện dãy số, mã có cấu trúc hoặc những đoạn đáp ứng một khuôn mẫu. Khác với tìm một từ cố định, regex có thể mô tả cả một loại nội dung, chẳng hạn một hoặc nhiều chữ số liên tiếp.
Trình kiểm tra Regex là công cụ giúp đối chiếu mẫu đó với văn bản do bạn cung cấp. Theo mã được cung cấp, công cụ sử dụng bộ máy RegExp của JavaScript, cập nhật kết quả khi mẫu, cờ hoặc văn bản thay đổi. Những đoạn tìm được sẽ được tô sáng và liệt kê cùng vị trí, nội dung và các nhóm bắt nếu có.
Công cụ giúp trả lời ba câu hỏi: biểu thức có được bộ máy chấp nhận không, nó khớp những đoạn nào và mỗi lần khớp giữ lại được những thành phần nào. Đây là cách kiểm tra hành vi của mẫu, không phải một bộ xác thực dữ liệu tự động.
Một kết quả khớp chỉ cho biết văn bản đáp ứng mẫu cùng các cờ đang dùng. Nó không chứng minh mã hàng tồn tại, số nhập vào phù hợp nghiệp vụ hay địa chỉ email nhận được thư. Muốn đánh giá những điều đó, bạn cần thêm quy tắc và phương thức xác minh ngoài regex.
Đầu vào và cách đọc kết quả kiểm tra regex
Ba đầu vào quyết định kết quả
Công cụ nhận ba thành phần riêng biệt: mẫu biểu thức, cờ và chuỗi kiểm tra. Trong ô mẫu, chỉ nhập nội dung như \d+, không nhập cặp dấu / bao ngoài. Hai dấu gạch chéo trên giao diện là phần trình bày, không phải phần bạn cần chép vào mẫu.
Cờ là các tùy chọn thay đổi cách tìm kiếm và có thể để trống. Văn bản kiểm tra có thể gồm nhiều dòng hoặc không có nội dung. Văn bản rỗng vẫn có khả năng đáp ứng một số mẫu hợp lệ, nhưng ô mẫu rỗng được công cụ xem là chưa nhập biểu thức, không đưa vào tìm kiếm.
Đọc đoạn khớp, vị trí và nhóm bắt
Số kết quả là số lượt khớp thu được, không phải số nhóm bắt. Các đoạn được tô bằng hai màu xen kẽ theo thứ tự xuất hiện; màu sắc chỉ giúp phân biệt các lượt, không biểu thị mức độ chính xác hay chất lượng của dữ liệu.
Mỗi kết quả có nội dung và một khoảng vị trí. Khoảng [3, 5) có nghĩa là bắt đầu tại vị trí 3, kết thúc trước vị trí 5. Vị trí được đánh số từ 0; đơn vị đếm được giải thích trong mục thuật ngữ bên dưới. Nhóm bắt xuất hiện dưới kết quả tương ứng và được đánh số riêng.
Nếu nhóm không tham gia lần khớp, giao diện ghi undefined. Điều này khác với nhóm đã tham gia nhưng bắt được chuỗi rỗng, được thể hiện bằng cặp dấu nháy không có nội dung bên trong.
Phân biệt các trạng thái thông báo
Chưa nhập nghĩa là thiếu mẫu; lỗi cú pháp nghĩa là không tạo được biểu thức từ mẫu và cờ; không khớp nghĩa là biểu thức hợp lệ nhưng không tìm được kết quả. Lỗi cờ cũng có thể nằm dưới nhãn lỗi cú pháp. Ngoài ra, mẫu đúng bằng (?:) bị chặn riêng và có thông báo khác; không nên hiểu rằng mọi mẫu có khả năng khớp rỗng đều bị chặn.
Các thuật ngữ regex cần hiểu trước khi đọc kết quả
Biểu thức chính quy và mẫu
Biểu thức chính quy là một hệ thống quy tắc mô tả dạng văn bản; mẫu là biểu thức cụ thể bạn đưa vào tìm kiếm. Chẳng hạn, [A-Z]+ mô tả một hoặc nhiều chữ hoa trong phạm vi A đến Z, thay vì một từ xác định. Mẫu quyết định nội dung nào có thể được lấy. Điểm dễ nhầm là một mẫu tìm được chuỗi con chưa chắc đã yêu cầu toàn bộ đầu vào đáp ứng cùng quy tắc.
Cờ
Cờ là tùy chọn điều chỉnh hành vi của bộ máy regex mà không cần viết lại toàn bộ mẫu. Trong công cụ này, g cho phép tiếp tục thu các lượt khớp, còn i thay đổi cách phân biệt chữ hoa và chữ thường. Không nên nhầm m với tìm nhiều kết quả: cờ này thay đổi ý nghĩa của neo theo dòng. Các cờ được nhập riêng, và tính hợp lệ của chúng phụ thuộc bộ máy JavaScript đang sử dụng.
Nhóm bắt
Nhóm bắt là phần mẫu đặt trong ngoặc có tác dụng giữ lại một thành phần của lần khớp. Với (AB)-(\d+), phần chữ và phần số có thể được đọc riêng, trong khi toàn bộ kết quả vẫn gồm cả dấu gạch nối. Không phải mọi ngoặc đều tạo nhóm bắt: (?:...) là nhóm không bắt. Giao diện này trình bày nhóm bằng số thứ tự, kể cả khi mẫu dùng nhóm có tên, chứ không hiển thị riêng tên nhóm.
Neo
Neo là điều kiện về vị trí, thường gặp là ^ và $. Chúng không lấy một chữ hay một chữ số vào kết quả mà yêu cầu việc khớp diễn ra ở đầu hoặc cuối phạm vi tương ứng. Neo giúp phân biệt tìm nội dung bên trong văn bản với kiểm tra từ đầu đến cuối. Khi có cờ m, neo có thể áp dụng ở ranh giới dòng, nên cách hiểu “toàn chuỗi” cần được xem xét lại.
Chỉ số và đơn vị mã UTF-16
JavaScript đánh vị trí chuỗi từ 0 theo đơn vị mã UTF-16. Đây là đơn vị kỹ thuật của chuỗi, không phải số byte hoặc số ký tự mà mắt người nhìn thấy. Một emoji ngoài phạm vi ký tự cơ bản có thể chiếm hai đơn vị; một chữ có dấu tổ hợp cũng có thể gồm nhiều thành phần. Vì vậy, khoảng vị trí công cụ hiển thị đôi khi khác với số thứ tự bạn đếm bằng mắt trong văn bản.
Công cụ tìm và đếm các kết quả khớp như thế nào?
Từ mẫu hợp lệ đến danh sách kết quả
Mỗi lần đầu vào thay đổi, công cụ tạo lại biểu thức từ mẫu và cờ hiện tại. Quá trình không tiếp nối trạng thái tìm kiếm của lần nhập trước. Nếu mẫu trống, công cụ chỉ hiển thị văn bản và yêu cầu nhập biểu thức. Nếu bộ máy không chấp nhận mẫu hoặc cờ, việc tìm kiếm không được thực hiện.
Với biểu thức hợp lệ, mỗi lượt tìm thành công làm số kết quả tăng một. Công cụ lấy toàn bộ nội dung khớp, thu các nhóm bắt rồi ghép phần tô sáng với văn bản không khớp. Mốc cuối được tính theo công thức: mốc kết thúc = mốc bắt đầu + độ dài chuỗi khớp. Đây là phép tính vị trí, không có làm tròn hoặc chuyển chuỗi số thành giá trị số.
Cờ thay đổi phạm vi tìm kiếm
Có g, công cụ tiếp tục tìm kết quả tiếp theo; không có g, nó dừng sau lượt khớp đầu tiên. Cờ i cho phép đối chiếu không phân biệt hoa–thường theo quy tắc của bộ máy. Cờ m điều chỉnh neo đầu và cuối theo dòng, còn s cho phép dấu chấm khớp ký tự kết thúc dòng. Khả năng chấp nhận các cờ và cú pháp tương ứng phụ thuộc trình duyệt.
Cờ y yêu cầu khớp ngay tại vị trí tìm hiện hành, thay vì tự dò qua một vùng không phù hợp. Vì vậy, gy không có nghĩa là quét mọi đoạn trong văn bản: một khoảng ngắt không khớp có thể khiến quá trình dừng. Theo luồng xử lý của công cụ, chỉ có y mà thiếu g vẫn dừng sau kết quả đầu.
Kết quả có độ dài bằng 0
Một số biểu thức khớp một vị trí nhưng không lấy ký tự nào. Kết quả đó có thể xuất hiện trong danh sách mà không tạo vùng tô sáng dễ thấy. Mẫu đúng bằng (?:) bị chặn riêng. Với các kết quả rỗng khác khi có g, công cụ tăng vị trí tìm tiếp thêm một đơn vị để hạn chế lặp. Cơ chế này không phải bảo đảm tránh mọi vấn đề, đặc biệt trong những tổ hợp Unicode phức tạp.
Ví dụ kiểm tra số, nhóm bắt và định dạng email
Các ví dụ sau dùng dữ liệu giả định; kết quả được suy luận từ mã và ngữ nghĩa regex JavaScript, không phải báo cáo chạy thử. Mọi vị trí đều tính theo đơn vị mã UTF-16.
Tìm dãy số và đối chiếu cờ g
Với văn bản Mã 12, lô 345., mẫu \d+ tìm từng dãy chữ số ASCII liên tiếp. Dấu + yêu cầu ít nhất một chữ số và cho phép lấy thêm các chữ số liền sau.
| Cờ | Số lượt khớp | Nội dung và khoảng vị trí |
|---|---|---|
g |
2 | 12 tại [3, 5); 345 tại [10, 13) |
| Để trống | 1 | 12 tại [3, 5) |
Khi không có g, dãy thứ hai không được liệt kê vì công cụ đã dừng, chứ không phải vì dãy đó sai quy tắc. Mẫu này không có ngoặc tạo nhóm bắt nên không có nội dung nhóm để hiển thị.
Tách phần chữ và phần số bằng nhóm bắt
Giả sử văn bản là AB-12 CD-345, mẫu là ([A-Z]+)-(\d+) và cờ là g. Phần trước dấu gạch nối phải gồm chữ hoa ASCII, phần sau gồm chữ số. Hai cặp ngoặc giữ lại hai thành phần đó.
AB-12khớp tại[0, 5): Group 1 làAB, Group 2 là12.CD-345khớp tại[6, 12): Group 1 làCD, Group 2 là345.
Tổng số lượt khớp là hai; các nhóm không được cộng vào tổng này. Với ví dụ khác, mẫu (a)?b trên văn bản b, không có cờ, cho một kết quả tại [0, 1). Group 1 là undefined vì phần a tùy chọn không tham gia.
Kiểm tra toàn chuỗi và mẫu email minh họa
Mẫu ^\d+$, không có cờ, khớp 1205 tại [0, 4) nhưng không khớp A1205. Nó kiểm tra dạng chữ số từ đầu đến cuối, không đánh giá số đó lớn, nhỏ hay phù hợp một khoảng giá trị nào.
Để minh họa định dạng email, dùng mẫu:
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
Với cờ để trống và chuỗi giả định user@example.test, mẫu cho một kết quả tại [0, 17), không có nhóm bắt. Kết quả chỉ xác nhận chuỗi đáp ứng quy ước của mẫu đơn giản này; nó không chứng minh hộp thư tồn tại, cũng không bao quát mọi dạng địa chỉ email hợp lệ.
Ứng dụng regex trong kiểm tra và trích xuất văn bản
Thử mẫu trích xuất dữ liệu có cấu trúc
Bạn có thể dùng công cụ để thử quy tắc nhận diện mã hàng, dãy số trong ghi chú hoặc các thành phần của chuỗi có cấu trúc. Đây là những cách sử dụng mẫu do bạn tự nhập, không phải các chế độ dựng sẵn dành riêng cho từng loại dữ liệu.
Phần tô sáng giúp phát hiện mẫu lấy quá rộng, chẳng hạn lấy cả dấu phân cách, hoặc quá hẹp, bỏ mất một phần mã. Nhóm bắt giúp kiểm tra phần nào sẽ được trích riêng. Nếu cần đối chiếu ý nghĩa ký hiệu, bảng tổng hợp ký hiệu regex có thể là tài liệu tham khảo; không nên mặc định trang đó tự chuyển mẫu vào trình kiểm tra.
Chuẩn bị bộ chuỗi kiểm tra đại diện
Một bộ dữ liệu thử hữu ích nên có trường hợp đúng quy ước, sai rõ ràng và gần đúng. Với mã có phần chữ và phần số, hãy xét cả trường hợp thiếu dấu phân cách, có ký tự thừa hoặc nằm giữa một câu. Với văn bản nhiều dòng, cần thử cả ranh giới dòng và khoảng trắng.
Mục đích là xem mẫu phản ứng ở những tình huống bạn thực sự quan tâm, thay vì chỉ nhìn một kết quả thành công. Khi dữ liệu liên quan tài khoản, liên hệ cá nhân hoặc nội dung nội bộ, hãy dùng giá trị giả nhưng giữ cấu trúc đại diện. Điều đó giúp kiểm tra quy tắc mà không phải đưa thông tin thật vào trang.
Tìm chuỗi con khác gì kiểm tra toàn bộ đầu vào?
Tìm một đoạn phù hợp
Tìm chuỗi con trả lời câu hỏi: Trong văn bản có đoạn nào đáp ứng mẫu không? Nội dung trước hoặc sau đoạn đó có thể không liên quan. Một mẫu tìm chữ số vẫn có thể thành công giữa câu chứa chữ cái, dấu câu và khoảng trắng. Cách dùng này phù hợp với trích xuất thông tin, nhưng không đủ để kết luận toàn bộ trường dữ liệu hợp lệ.
Tìm bằng regex cũng khác tìm văn bản cố định. Dấu chấm trong mẫu thường mang nghĩa “một ký tự” theo điều kiện của bộ máy, không mặc nhiên là dấu chấm thật. Nếu muốn tìm đúng dấu chấm, bạn có thể biểu diễn nó bằng \.. Những ký tự đặc biệt khác cũng cần được hiểu theo cú pháp, không chỉ theo hình dạng.
Yêu cầu đầu vào đáp ứng trọn vẹn
Kiểm tra trọn đầu vào đòi hỏi mẫu ràng buộc cả phạm vi, thường bằng neo đầu–cuối và các thành phần được phép xuất hiện. Khác biệt giữa \d+ và ^\d+$ nằm ở yêu cầu về ranh giới, không phải ở loại chữ số được tìm.
Với văn bản nhiều dòng, cờ m có thể khiến neo áp dụng theo từng dòng. Khi đó, một dòng phù hợp không đồng nghĩa cả văn bản phù hợp. Cần xét cả mẫu lẫn cờ khi diễn giải kết quả.
Ngay cả khi một email đáp ứng trọn mẫu, điều được kiểm tra vẫn chỉ là định dạng. Tính tồn tại, quyền sở hữu và khả năng nhận thư thuộc về xác minh nghiệp vụ, không phải điều regex chứng minh.
Giới hạn và lưu ý khi dùng Regex Tester
Khác biệt cú pháp và xử lý tiếng Việt
Công cụ sử dụng regex JavaScript, không có lựa chọn bộ máy PCRE, Python, Java hay .NET trong phần mã được cung cấp. Một mẫu hoạt động ở môi trường khác có thể không được chấp nhận hoặc có hành vi khác ở đây. Cú pháp và cờ mới còn phụ thuộc phiên bản trình duyệt.
Trong JavaScript, \d chỉ chữ số ASCII từ 0 đến 9; \w không đại diện cho mọi chữ cái tiếng Việt. Dấu chấm mặc định không khớp ký tự kết thúc dòng. Bảng gợi ý ngắn trên giao diện nên được hiểu như lời nhắc, không thay thế giải thích đầy đủ về các ký hiệu.
Hiệu năng, khớp rỗng và dữ liệu nhạy cảm
Mã được cung cấp không thể hiện thời hạn thực thi hay ngưỡng số kết quả. Mẫu có nhiều quay lui trên văn bản dài có thể khiến giao diện chậm hoặc mất phản hồi. Không có cơ sở để đưa ra dung lượng tối đa xử lý ổn định. Việc tăng vị trí sau khớp rỗng cũng chưa bảo đảm loại trừ mọi vòng lặp khi kết hợp Unicode.
Không thấy chức năng thay thế văn bản, xuất tệp hoặc lưu bộ mẫu trong mã này. Việc chuyển ký tự HTML đặc biệt thành dạng văn bản khi hiển thị nội dung không phải chứng nhận bảo mật cho toàn trang.
Chưa có đủ thông tin về toàn bộ trang và chính sách dữ liệu để khẳng định nội dung không được gửi đi hoặc lưu lại. Hãy ưu tiên dữ liệu giả và kiểm tra lại mẫu trong môi trường sẽ sử dụng thực tế.
Câu hỏi thường gặp
Vì sao văn bản có nhiều đoạn phù hợp nhưng chỉ hiện một kết quả?
Nguyên nhân thường gặp là ô cờ chưa có g. Công cụ dừng ngay sau lượt khớp đầu tiên khi thiếu cờ này, dù phía sau vẫn còn đoạn phù hợp. Nếu đã có g, hãy xem các điều kiện khác của mẫu và cờ. Chẳng hạn, cờ y có thể làm việc tìm dừng tại một khoảng ngắt. Ngoài ra, một mẫu có thể lấy cả một đoạn dài thành một kết quả thay vì chia thành nhiều lượt.
Có cần nhập dấu / ở đầu và cuối biểu thức không?
Không. Bạn chỉ nhập phần mẫu vào ô biểu thức và nhập cờ vào ô riêng. Chẳng hạn, mẫu là \d+ và cờ là g, thay vì đưa cả /\d+/g vào ô mẫu. Giao diện đã trình bày hai dấu gạch chéo để gợi hình thức quen thuộc của regex. Nếu bạn thêm chúng vào nội dung nhập, chúng có thể trở thành phần của quy tắc tìm kiếm, khiến kết quả khác với ý định ban đầu.
Vì sao thêm cờ lại làm công cụ báo lỗi cú pháp?
Vì công cụ tạo biểu thức từ cả mẫu lẫn chuỗi cờ, nên lỗi ở một trong hai phần đều có thể được báo dưới nhãn lỗi cú pháp. Cờ lặp, cờ không được trình duyệt hỗ trợ hoặc tổ hợp cờ không hợp lệ có thể khiến việc tạo biểu thức thất bại. Hãy kiểm tra riêng phần cờ thay vì chỉ tìm lỗi trong mẫu. Nội dung thông báo chi tiết có thể khác nhau giữa các bộ máy JavaScript của trình duyệt.
Chỉ số kết thúc có thuộc đoạn văn bản được khớp không?
Không. Chỉ số kết thúc là vị trí ngay sau đoạn khớp, còn chỉ số bắt đầu thuộc đoạn đó. Vì vậy, khoảng [3, 5) có độ dài hai đơn vị mã UTF-16, không phải ba. Cách đọc này thuận tiện để xác định ranh giới giữa phần được lấy và phần còn lại. Tuy nhiên, độ dài theo UTF-16 không luôn trùng số ký tự nhìn thấy, nhất là khi văn bản chứa emoji hoặc chữ được tạo bằng dấu tổ hợp.
Group hiển thị undefined có nghĩa là biểu thức bị lỗi không?
Không. undefined ở một nhóm thường có nghĩa nhóm đó không tham gia lần khớp hiện tại, trong khi toàn bộ biểu thức vẫn khớp thành công. Điều này có thể xảy ra với nhóm tùy chọn hoặc nhóm nằm trong một nhánh không được chọn. Cần phân biệt nó với nhóm bắt được chuỗi rỗng: trường hợp sau đã tham gia nhưng không giữ ký tự nào. Hãy đọc nội dung toàn bộ kết quả cùng các nhóm để hiểu phần nào thực sự được lấy.
Vì sao dùng \w không tìm được trọn vẹn một số từ tiếng Việt?
Vì \w trong JavaScript không phải ký hiệu bao quát mọi chữ cái của mọi ngôn ngữ. Nó chủ yếu liên quan chữ Latin cơ bản, chữ số và dấu gạch dưới; một số chế độ có chi tiết bổ sung nhưng không biến nó thành tập hợp mọi chữ tiếng Việt. Nếu mục tiêu là nhận diện chữ Unicode, cần chọn quy tắc phù hợp và kiểm tra khả năng hỗ trợ của môi trường. Văn bản có dấu tổ hợp cũng cần được xét, không chỉ dạng hiển thị bằng mắt.
Regex khớp email có chứng minh địa chỉ đó nhận được thư không?
Không. Regex chỉ đối chiếu chuỗi với quy tắc định dạng bạn đã nhập. Nó không kiểm tra hộp thư có tồn tại, đang hoạt động, thuộc về ai hoặc có nhận được một thư cụ thể hay không. Một mẫu đơn giản còn có thể chấp nhận địa chỉ không phù hợp hoặc bỏ sót dạng địa chỉ hợp lệ. Khi cần xác minh khả năng liên hệ hay quyền sở hữu, phải có quy trình riêng, chẳng hạn yêu cầu người dùng hoàn tất xác nhận qua thư.


17 bình luận
Vũ Bảo Thành
Lần đầu học regex nên hơi lú phần cấu hình 😅 Mong có tooltip giải thích bằng tiếng Việt cho từng tùy chọn.
Vũ Thu Yến
Mình bật chế độ không phân biệt hoa thường mà vẫn chưa ra kết quả mong muốn. Không biết do pattern hay mình cấu hình thiếu gì nữa.
Hồ Gia Trang
Mình muốn tìm các dòng bắt đầu bằng một mã nhất định trong đoạn nhiều dòng. Có phải bật cờ m rồi dùng dấu ^ không?
Lý Đức Mai
Cho hỏi Regex Tester này dùng engine JavaScript hay loại nào vậy? Mình muốn chắc là kết quả giống môi trường đang chạy.
Hồ Hải Hà
phan Matches de doc, minh thu tach ma san pham va thay ket qua dung nhu mong doi
Huỳnh Hữu Vy
Mình thấy có IBAN validator and parser trong mục công cụ tương tự. Công cụ đó có báo được IBAN thuộc quốc gia nào không?
Đỗ Thu Trung
web co luu lai regex vua thu khong nhi? lo tay reload la minh phai nhap lai tu dau
Hồ Thanh Hoàng
Ui cứu tinh lúc debug regex luôn á :)) Nhìn chỗ khớp là biết mình viết sai ở đâu.
Lý Thị Linh
Numeronym generator nhìn thú vị ghê, giờ mới hiểu kiểu viết i18n là tạo như thế nào. Có dịp sẽ thử thêm.
Vũ Văn Dũng
Nếu có chức năng chia sẻ một bộ regex kèm chuỗi kiểm tra qua đường link thì tuyệt, mình gửi cho đồng nghiệp xem sẽ nhanh hơn.
Đỗ Minh Hương
Text diff hữu ích phết, mình dùng để so đoạn dữ liệu trước và sau khi sửa regex. Hai công cụ này kết hợp khá hợp lý.
Huỳnh Bảo Dũng
Có nút sao chép toàn bộ kết quả khớp thì tiện hơn, nhất là lúc mình cần lấy nhiều mã từ một đoạn văn bản dài.
Lê Hải Nam
Mình thích việc đặt các công cụ tương tự ngay bên dưới. Đang kiểm tra dữ liệu xong chuyển sang Text diff để so sánh luôn.
Lý Tiến Trang
test regex tren web nay tien ghe, khoi phai mo editor chi de thu mot doan nho
Phan Văn Thảo
Phần Cấu hình Regex khá tiện, nhưng nên có giải thích ngắn cho từng cờ như g, i, m để người mới dễ hiểu.
Đặng Ngọc Nam
Cho mình hỏi nhập biểu thức có cần thêm dấu / ở đầu và cuối không, hay chỉ nhập phần pattern thôi?
Trần Minh Mai
Mình dùng Trình kiểm tra Regex để lọc mã đơn hàng, kết quả Matches hiển thị rõ nên dò lỗi nhanh hơn hẳn.