Regex Tester Online (Free) – Trực quan hóa Match, Cheat Sheet & Ví dụ

Công cụ để học, thực hành và debug Regular Expressions trực tuyến một cách dễ dàng
Bạn có thể gõ bất kỳ đoạn Text nào và chèn linh hoạt nhiều biến $1, $2... vào giữa các chữ. $1, $2...
Ví dụ: Tên người dùng: $1, Tên miền: $2
str.replace(/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@(([^<>()\[\]\\.,;:\s@"]+\.)+[^<>()\[\]\\.,;:\s@"]{2,})$/gm, ``)Thư viện Regex thực tế (40)
Nhấp vào một mẫu bất kỳ để load ngay lên công cụ phía trên.
Regex Cheat Sheet & RegExp Syntax for JS, PHP, Python, Java...
1. Lớp ký tự (Character Classes)
[abc]Một ký tự bất kỳ trong: a, b hoặc c[^abc]Phủ định: Một ký tự NGOẠI TRỪ a, b hoặc c[a-z]Một ký tự trong khoảng từ a đến z[^a-z]Ký tự không thuộc khoảng từ a đến z[0-9]Một chữ số từ 0 đến 9[a-zA-Z]Chữ cái hoa hoặc thường từ a-z hoặc A-Z[a-zA-Z0-9]Chữ cái (hoa/thường) hoặc chữ số
2. Chuỗi Meta (Meta Sequences)
.Bất kỳ ký tự đơn nào\sBất kỳ ký tự khoảng trắng nào\SBất kỳ ký tự KHÔNG phải khoảng trắng nào\dBất kỳ chữ số nào (Giống [0-9])\DKHÔNG phải chữ số (Giống [^0-9])\wBất kỳ ký tự chữ/số/gạch dưới (Word character)\WKHÔNG phải Word character\XChuỗi Unicode bất kỳ (Bao gồm cả ngắt dòng)\CKhớp một đơn vị dữ liệu (data unit)\RKý tự xuống dòng Unicode (Unicode newlines)\v / \VKhoảng trắng dọc / KHÔNG phải khoảng trắng dọc\h / \HKhoảng trắng ngang / KHÔNG phải khoảng trắng ngang\KReset match (Đặt lại kết quả khớp)\nKhớp với mẫu phụ (subpattern) thứ n\pX / \p{...}Thuộc tính hoặc danh mục kịch bản Unicode\PX / \P{...}Phủ định của \pX và \p{...}\Q...\EBao trong dấu quote; xử lý như chuỗi văn bản thuần túy\k<name> / \k'name' / \k{name}Khớp mẫu phụ theo tên (name)\gn / \g{n}Khớp mẫu phụ (subpattern) thứ n\g<n> / \g'n'Đệ quy nhóm trích xuất (capture group) thứ n\g{-n}Khớp mẫu phụ trước đó theo quan hệ tương đối\g<+n> / \g'+n'Đệ quy/Khớp mẫu phụ sắp tới theo quan hệ tương đối\xYY / \x{YYYY}Ký tự Hex YY / YYYY\dddKý tự bát phân (Octal) ddd\cYKý tự điều khiển (Control character) Y[\b]Ký tự Backspace\Dùng để thoát (escape) biến ký tự đặc biệt thành ký tự thường
3. Số lần lặp (Quantifiers)
a?0 hoặc 1 chữ aa*0 hoặc nhiều chữ aa+1 hoặc nhiều chữ aa{3}Chính xác 3 chữ aa{3,}3 hoặc nhiều chữ aa{3,6}Từ 3 đến 6 chữ aa*Greedy quantifier (Khớp tham lam - nhiều nhất có thể)a*?Lazy quantifier (Khớp lười biếng - ít nhất có thể)a*+Possessive quantifier (Khớp sở hữu - không lùi lại/backtrack)
4. Cấu trúc nhóm (Group Constructs)
(...)Bắt (Capture) mọi thứ được bao bọc bên trong(a|b)Khớp hoặc a hoặc b(?:...)Khớp mọi thứ bên trong nhưng KHÔNG trích xuất (Non-capturing)(?>...)Nhóm nguyên tử - Atomic group (Non-capturing, Nhanh hơn)(?|...)Nhân bản số thứ tự của nhóm mẫu phụ (Duplicate group number)(?#...)Ghi chú (Comment - Bị regex engine bỏ qua)(?'name'...) / (?<name>...) / (?P<name>...)Nhóm trích xuất được ĐẶT TÊN(?imsxXU)Bộ sửa đổi nội tuyến (Inline modifiers)(?(DEFINE)...)Định nghĩa trước các mẫu pattern để sử dụng sau
5. Neo vị trí (Anchors)
\GBắt đầu của đoạn khớp (Start of match)^ / \ABắt đầu của chuỗi$ / \ZKết thúc của chuỗi\zĐiểm kết thúc tuyệt đối của chuỗi\bRanh giới từ (Word boundary)\BKhông phải ranh giới từ (Non-word boundary)
6. Khẳng định & Điều kiện (Assertions & Lookarounds)
(?(1)yes|no)Điều kiện: Nếu group 1 tồn tại thì khớp 'yes', ngược lại 'no'(?(R)yes|no)Câu lệnh điều kiện đệ quy(?(?=...)yes|no)Điều kiện Lookahead(?(?<=...)yes|no)Điều kiện Lookbehind(?=...)Positive Lookahead (Tìm trước xem CÓ khớp không)(?!...)Negative Lookahead (Tìm trước xem KHÔNG khớp không)(?<=...)Positive Lookbehind (Nhìn lại phía sau xem CÓ khớp không)(?<!...)Negative Lookbehind (Nhìn lại phía sau xem KHÔNG khớp không)
7. Thay thế (Substitution)
\0Toàn bộ nội dung khớp\1 / $1Nội dung của nhóm trích xuất (capture group) 1${foo}Nội dung của nhóm trích xuất tên 'foo'\x20 / \x{06fa}Giá trị thay thế Hexadecimal\t, \r, \n, \fTab, Carriage return, Newline, Form-feed\U / \LChuyển thành Chữ Hoa / Chữ Thường\EKết thúc lệnh chuyển đổi chữ hoa/thường
8. Đệ quy (Recurse)
(?R)Đệ quy toàn bộ pattern(?1)Đệ quy mẫu phụ đầu tiên(?+1)Đệ quy mẫu phụ tương đối đầu tiên(?&name) / (?P>name)Đệ quy mẫu phụ theo tên 'name'(?P=name)Khớp với mẫu phụ tên 'name'
9. Lớp ký tự POSIX (POSIX Character Classes)
[[:alnum:]]Chữ cái và chữ số (Giống[0-9A-Za-z])[[:alpha:]]Chữ cái (Giống [A-Za-z])[[:ascii:]]Mã ASCII 0-127 (Giống [\x00-\x7F])[[:blank:]]Chỉ Dấu cách hoặc Tab (Giống[\t ])[[:cntrl:]]Ký tự điều khiển[[:digit:]]Chữ số thập phân (Giống [0-9])[[:graph:]]Ký tự hiển thị được (Không tính dấu cách)[[:lower:]] / [[:upper:]]Chữ cái viết thường / viết hoa[[:print:]]Ký tự hiển thị được (Tính cả dấu cách)[[:punct:]]Ký tự dấu câu hiển thị được[[:space:]]Khoảng trắng (Giống[\t\n\v\f\r ])[[:word:]]Ký tự từ ngữ (Giống [0-9A-Za-z_])[[:xdigit:]]Chữ số Hexadecimal (Giống[0-9A-Fa-f])[[:<:]] / [[:>:]]Bắt đầu / Kết thúc của một từ
10. Cờ / Công cụ sửa đổi (Flags/Modifiers)
gToàn cục (Global)mNhiều dòng (Multiline)iKhông phân biệt hoa/thường (Case insensitive)x / XBỏ qua khoảng trắng / eXtendedsDòng đơn (Single line) - Dấu chấm khớp cả \nu / UUnicode / Ungreedy (Không tham lam)ANeo (Anchor)JCho phép trùng lặp tên nhóm (Duplicate group names)
🐍 Regex trong Python (Module 're')
re.findall(pat, str)Trả về một danh sách (list) chứa TẤT CẢ các kết quả khớp.re.finditer(pat, str)Trả về một iterable các Match objects (cho từng kết quả khớp).re.search(pat, str)Trả về Match object nếu khớp ở BẤT KỲ ĐÂU trong chuỗi.re.split(pat, str)Trả về danh sách chuỗi đã được cắt tại mỗi điểm khớp.re.sub(pat, repl, str)Thay thế một hoặc nhiều điểm khớp bằng chuỗi mới.re.compile(pat)Biên dịch pattern thành object để tái sử dụng nhanh hơn.re.escape(str)Thêm dấu '\' vào tất cả ký tự không phải chữ/số trong chuỗi.Flags:re.I (IGNORECASE), re.M (MULTILINE), re.L (LOCALE), re.S (DOTALL), re.U (UNICODE), re.X (VERBOSE)
🛠 Regex trong JavaScript
regex.test(str)Trả về Boolean (true/false) xem chuỗi có khớp pattern không.regex.exec(str)Trả về mảng chi tiết về kết quả khớp (hoặc null).str.match(regex)Trả về mảng các kết quả khớp (tùy thuộc cờ 'g').str.matchAll(regex)Trả về một Iterator của tất cả các kết quả khớp chi tiết (Bắt buộc dùng cờ 'g').str.search(regex)Trả về index vị trí đầu tiên khớp, nếu không thấy trả về -1.str.split(regex)Cắt chuỗi thành một mảng, chia tại điểm khớp regex.str.replace(regex, 'new')Thay thế chuỗi. Dùng cờ 'g' để thay thế tất cả.str.replaceAll(regex, 'new')Thay thế tất cả (Bắt buộc Regex phải truyền cờ 'g').
🐘 Regex trong PHP
preg_match($pat, $str)Thực hiện kiểm tra khớp. Trả về 1 nếu khớp, 0 nếu không.preg_match_all($pat, $str, &$out)Tìm và lưu tất cả kết quả khớp vào mảng $out.preg_replace($pat, $repl, $str)Tìm kiếm bằng regex và thay thế bằng chuỗi $repl.preg_replace_callback()Tìm và thay thế nhưng qua một hàm callback tự định nghĩa.preg_split($pat, $str)Tách chuỗi $str thành một mảng tại các điểm khớp regex.preg_grep($pat, $array)Trả về các phần tử trong mảng khớp với pattern.
☕ Regex trong Java
Pattern.compile("pat", flags)Khởi tạo Pattern object (vd: Pattern.CASE_INSENSITIVE).Pattern.matches("pat", "str")Kiểm tra tĩnh xem pattern có khớp TOÀN BỘ chuỗi không.Pattern.quote("str")Trả về chuỗi pattern an toàn (escape tự động).Matcher m = p.matcher("str")Tạo Matcher object áp dụng pattern lên chuỗi.m.matches()Kiểm tra toàn bộ chuỗi có khớp không.m.find(start)Tìm đoạn khớp tiếp theo trong chuỗi.m.group(group) / m.group("name")Trích xuất giá trị bắt được theo số thứ tự hoặc tên.m.start() / m.end()Trả về vị trí bắt đầu/kết thúc của đoạn khớp.m.reset()Reset lại bộ máy so khớp (Matcher).str.matches("pat") / str.split("pat")Các hàm có sẵn của class String dùng Regex.str.replaceAll("pat", "repl")Hàm String thay thế toàn bộ theo regex.
🐬 Regex trong MySQL
expr REGEXP patToán tử kiểm tra xem biểu thức expr có khớp với pat không.REGEXP_INSTR(expr, pat)Trả về chỉ số (vị trí bắt đầu) của chuỗi con khớp với regex. (MySQL 8.0+)REGEXP_LIKE(expr, pat, 'c')Hàm kiểm tra khớp có hỗ trợ cờ ('i' case-insensitive, 'm' multiline...). (MySQL 8.0+)REGEXP_REPLACE(expr, pat, repl)Thay thế các chuỗi con khớp regex bằng chuỗi 'repl'. (MySQL 8.0+)REGEXP_SUBSTR(expr, pat)Trả về chính xác chuỗi con khớp với regex. (MySQL 8.0+)
Đánh giá công cụ này
(4.9 ⭐ / 360 lượt đánh giá)
Giới thiệu về Biểu thức chính quy (Regular Expressions) và Công cụ Regex
Biểu thức chính quy, thường được gọi là regex hay regexp, là một chuỗi các ký tự tạo thành một mẫu tìm kiếm. Các lập trình viên (developer), chuyên gia phân tích dữ liệu và quản trị hệ thống sử dụng chúng hàng ngày để tìm kiếm, khớp (match) và xử lý văn bản. Dù bạn đang cần kiểm tra tính hợp lệ của một địa chỉ email, trích xuất dữ liệu từ một file log khổng lồ, hay thay thế các chuỗi cụ thể trong code, regex luôn là một công cụ cực kỳ mạnh mẽ.
Tuy nhiên, cú pháp regex đôi khi rất khó đọc và khó viết. Một mẫu regex phức tạp thường trông giống như một chuỗi ký tự ngẫu nhiên, khó hiểu. Đó là lý do tại sao việc sử dụng một công cụ regex chuyên dụng là cực kỳ cần thiết. Môi trường kiểm tra trực quan giúp bạn hiểu chính xác cách mẫu regex của bạn hoạt động trên văn bản. Bằng cách phản hồi ngay lập tức, công cụ test regex giúp bạn không phải “đoán mò” và tiết kiệm được hàng giờ đồng hồ ngồi debug (gỡ lỗi).
Công cụ Trực quan hóa Regex là gì?
Công cụ trực quan hóa regex (regex visualization tool) là một ứng dụng phần mềm hoặc giao diện web tương tác. Nó cho phép bạn viết một biểu thức chính quy và ngay lập tức nhìn thấy kết quả khớp trên một chuỗi văn bản thử nghiệm. Thay vì phải chạy đi chạy lại một đoạn script trong terminal để xem regex có hoạt động không, công cụ này sẽ bôi sáng (highlight) các phần tử khớp theo thời gian thực.
Các trình test regex hiện đại không chỉ dừng lại ở việc bôi sáng đơn giản. Chúng còn phân tích chi tiết các nhóm (capture groups), giải thích lỗi cú pháp, kiểm tra việc thay thế văn bản, và thậm chí tự động tạo mã nguồn (code) để bạn chạy regex trong dự án của mình. Bằng cách kết hợp giao diện kiểm tra với một bảng tra cứu regex (regex cheat sheet) đầy đủ, những công cụ này vừa là một tiện ích đắc lực vừa là một nền tảng tuyệt vời để học tập.
Các tính năng cốt lõi của Công cụ Regex Master
Regex Master Tool được xây dựng để xử lý mọi thứ, từ việc khớp chuỗi cơ bản đến trích xuất dữ liệu phức tạp gồm nhiều nhóm. Nó được thiết kế với luồng làm việc mượt mà, phù hợp cho cả người mới bắt đầu lẫn các lập trình viên dày dặn kinh nghiệm. Dưới đây là các tính năng chính của công cụ này.
1. Bôi sáng và xem trước Regex theo thời gian thực
Ngay khi bạn gõ mẫu regex vào ô nhập liệu, công cụ sẽ lập tức xử lý và đối chiếu với chuỗi văn bản thử nghiệm. Nó bôi sáng rõ ràng, trực quan để chỉ cho bạn chính xác phần nào của văn bản đã khớp với mẫu. Nếu regex của bạn có lỗi cú pháp, công cụ sẽ báo lỗi ngay lập tức. Nó cũng tích hợp tính năng kiểm tra an toàn, cảnh báo nếu regex của bạn vô tình khớp với một chuỗi rỗng trong khi cờ global (toàn cục) đang bật, giúp bạn tránh khỏi các vòng lặp vô tận gây treo máy.
2. Trình khám phá Match và Capture Groups
Khi bạn sử dụng dấu ngoặc đơn () trong regex, bạn đang tạo ra các capture groups (nhóm bắt giữ). Công cụ cung cấp một tab riêng biệt mang tên “Match & Groups Explorer”. Phần này phân tích từng kết quả khớp thành một bảng biểu rõ ràng, dễ đọc. Với mỗi kết quả, bạn có thể xem chính xác vị trí index, độ dài của chuỗi khớp, và dữ liệu cụ thể được trích xuất bởi từng nhóm (ví dụ: Group 1, Group 2). Nó thậm chí còn hỗ trợ đầy đủ và hiển thị trực quan các Named Capture Groups (nhóm được đặt tên) như (?<name>...), giúp việc trích xuất dữ liệu trở nên cực kỳ minh bạch.
3. Trình kiểm tra thay thế văn bản nâng cao
Tìm kiếm văn bản mới chỉ là một nửa chặng đường; thay thế nó mới là phần còn lại. Tab “Template Replace Tester” cho phép bạn nhập vào chuỗi thay thế và linh hoạt chèn các biến như $1, $2, v.v. Bạn có thể xem trước văn bản sau khi sửa đổi, trong đó tất cả các phần mới được thay thế sẽ được bôi màu cam nổi bật. Công cụ cũng cung cấp các nút chèn nhanh cho các nhóm capture đang hoạt động và ký tự xuống dòng \n.
4. Tự động tạo code JS/TS
Khi regex của bạn đã hoạt động hoàn hảo trên trình kiểm tra, bạn sẽ cần đưa nó vào dự án của mình. Tab “Code Generator” sẽ tự động viết sẵn mã JavaScript hoặc TypeScript cho bạn. Nó cung cấp các đoạn code (snippet) làm sẵn để kiểm tra chuỗi (trả về Boolean), trích xuất toàn bộ kết quả bằng matchAll, và thực hiện thay thế chuỗi. Bạn chỉ cần bấm một nút là có thể copy toàn bộ code vào clipboard.
5. Thư viện Regex tích hợp sẵn (Hơn 50 mẫu thực tế)
Không phải lúc nào bạn cũng cần viết regex từ con số không. Công cụ này tích hợp một thư viện đồ sộ, được phân loại rõ ràng với hơn 50 mẫu regex thực tế. Cùng với thanh tìm kiếm tiện lợi, bạn có thể nhanh chóng tìm thấy các mẫu để validate dữ liệu người dùng, trích xuất thông tin mạng, định dạng ngày tháng, hoặc phân tích code. Chỉ cần click vào một mẫu bất kỳ, công cụ sẽ tự động tải pattern (mẫu), flags (cờ), và một chuỗi thử nghiệm ngay vào trình chỉnh sửa.
Cách sử dụng Công cụ Regex một cách hiệu quả
Quy trình làm việc của công cụ regex này được thiết kế theo các bước rất logic. Dưới đây là cách để bạn khai thác tối đa sức mạnh của nó:
- Bước 1: Nhập mẫu Regex của bạn. Gõ biểu thức chính quy vào thanh nhập liệu chính. Đừng bao gồm các dấu gạch chéo
/, vì công cụ sẽ tự động xử lý chúng. - Bước 2: Bật/tắt các Regex Flags. Ngay cạnh ô nhập liệu, bạn sẽ thấy các nút dành cho các cờ như
g(tìm toàn cục),i(không phân biệt hoa/thường), vàm(nhiều dòng). Hãy click để bật hoặc tắt tùy theo nhu cầu của bạn. - Bước 3: Nhập chuỗi thử nghiệm (Test String). Dán đoạn văn bản mà bạn muốn tìm kiếm vào ô “Test String”. Hãy quan sát bảng “Match Highlights” tự động cập nhật ngay lập tức.
- Bước 4: Kiểm tra các nhóm (Groups). Nếu bạn đang cần trích xuất dữ liệu cụ thể, hãy chuyển sang tab “Match & Groups Explorer”. Kiểm tra bảng để đảm bảo các nhóm capture đang lấy đúng phần dữ liệu mà bạn cần.
- Bước 5: Thử nghiệm thay thế chuỗi. Nếu bạn cần sửa đổi văn bản, hãy mở tab “Template Replace Tester”. Nhập mẫu thay thế của bạn và sử dụng
$1hoặc$2để gọi lại các nhóm đã bắt. Xem lại kết quả đầu ra được bôi sáng. - Bước 6: Xuất Code. Khi đã ưng ý, chuyển đến tab “Code Generator”, nhấn “Copy Code” và dán trực tiếp vào ứng dụng của bạn.
Bảng tra cứu (Cheat Sheet) và Hướng dẫn cú pháp Regex toàn tập
Để làm chủ các biểu thức chính quy, bạn bắt buộc phải hiểu cú pháp của chúng. Công cụ này cung cấp một bảng tra cứu regex (cheat sheet) cực kỳ chi tiết ngay trên giao diện. Dưới đây là phần giải thích toàn diện về các quy tắc, lớp ký tự (character classes) và logic trong regex.
1. Lớp ký tự (Character Classes)
Lớp ký tự cho phép bạn khớp với một ký tự nằm trong một tập hợp cụ thể.
[abc]: Khớp với một ký tự duy nhất là a, b, hoặc c.[^abc]: Phủ định. Khớp với bất kỳ ký tự nào NGOẠI TRỪ a, b, hoặc c.[a-z]: Khớp với bất kỳ chữ cái in thường nào từ a đến z.[0-9]: Khớp với một chữ số duy nhất từ 0 đến 9.[a-zA-Z0-9]: Khớp với bất kỳ ký tự chữ và số nào (in hoa, in thường, hoặc chữ số).
2. Các ký tự đại diện (Meta Sequences / Shorthands)
Đây là các mã viết tắt (shorthand) đại diện cho những lớp ký tự phổ biến nhất.
.: Khớp với mọi ký tự duy nhất (thường ngoại trừ ký tự xuống dòng).\s: Khớp với bất kỳ ký tự khoảng trắng nào (dấu cách, tab, dấu xuống dòng).\S: Khớp với bất kỳ ký tự nào KHÔNG PHẢI khoảng trắng.\d: Khớp với bất kỳ chữ số nào (tương tự như[0-9]).\D: Khớp với bất kỳ ký tự nào KHÔNG PHẢI là chữ số.\w: Khớp với bất kỳ ký tự từ ngữ nào (chữ cái, chữ số, và dấu gạch dưới).\W: Khớp với bất kỳ ký tự nào KHÔNG PHẢI từ ngữ.\n: Khớp với ký tự xuống dòng (newline).\: Ký tự thoát (escape). Dùng để biến các ký tự đặc biệt thành văn bản thông thường (ví dụ:\.sẽ khớp với một dấu chấm thực sự).
3. Số lượng từ (Quantifiers / Repetitions)
Quantifier (số lượng từ) báo cho bộ máy regex biết ký tự hoặc nhóm phía trước cần được lặp lại bao nhiêu lần.
a?: Khớp 0 hoặc 1 lần xuất hiện của chữ “a” (khiến nó trở thành tùy chọn, có cũng được không có cũng được).a*: Khớp 0 hoặc nhiều lần xuất hiện của chữ “a”.a+: Khớp 1 hoặc nhiều lần xuất hiện của chữ “a”.a{3}: Khớp chính xác 3 lần xuất hiện của chữ “a”.a{3,}: Khớp 3 lần trở lên xuất hiện của chữ “a”.a{3,6}: Khớp từ 3 đến 6 lần xuất hiện của chữ “a”.*?: Lazy quantifier (Bộ định lượng lười biếng). Khớp với ít ký tự nhất có thể (thay vì hành vi tham lam – greedy mặc định).
4. Neo (Anchors) và Ranh giới (Boundaries)
Neo không dùng để khớp ký tự; chúng dùng để khớp các vị trí bên trong văn bản.
^: Khớp vị trí bắt đầu tuyệt đối của chuỗi (hoặc của dòng, nếu bật cờ multiline).$: Khớp vị trí kết thúc tuyệt đối của chuỗi (hoặc của dòng).\b: Khớp ranh giới từ (vị trí nằm giữa một ký tự từ ngữ và một ký tự không phải từ ngữ).\B: Khớp ranh giới không phải từ.
5. Gom nhóm (Grouping) và Kiểm tra trước/sau (Lookarounds)
Việc gom nhóm giúp bạn cô lập các phần của kết quả khớp, trong khi lookaround cho phép bạn kiểm tra các điều kiện mà không đưa chúng vào kết quả cuối cùng.
(...): Một capture group tiêu chuẩn. Trích xuất tất cả những gì nằm bên trong nó.(?:...): Non-capturing group. Gom các mục lại với nhau để xử lý logic (như câu lệnh OR) mà không lưu lại dữ liệu được trích xuất.(?<name>...): Named capture group (nhóm có tên). Gán một cái tên cụ thể cho phần dữ liệu được trích xuất.(a|b): Logic OR. Khớp với “a” hoặc “b”.(?=...): Positive Lookahead (Kiểm tra phía trước tích cực). Đảm bảo rằng phần theo sau khớp với mẫu, nhưng không đưa nó vào kết quả khớp.(?!...): Negative Lookahead (Kiểm tra phía trước tiêu cực). Đảm bảo rằng phần theo sau KHÔNG khớp với mẫu.(?<=...): Positive Lookbehind (Kiểm tra phía sau tích cực). Đảm bảo rằng phần đứng trước khớp với mẫu.(?<!...): Negative Lookbehind (Kiểm tra phía sau tiêu cực). Đảm bảo rằng phần đứng trước KHÔNG khớp với mẫu.
Hiểu về các Cờ Regex (Regex Flags)
Cờ (hay còn gọi là modifiers) thay đổi cách hoạt động của toàn bộ biểu thức chính quy. Chúng thường được đặt ở cuối mẫu, ví dụ như /pattern/g. Công cụ Regex Master cho phép bạn bật/tắt chúng một cách dễ dàng:
- Global (g): Mặc định, regex sẽ dừng lại sau khi tìm thấy kết quả khớp đầu tiên. Cờ global ép nó quét toàn bộ chuỗi và trả về mọi kết quả tìm thấy.
- Ignore Case (i): Biến quá trình tìm kiếm thành không phân biệt hoa/thường. Mẫu
/a/isẽ khớp với cả “a” và “A”. - Multiline (m): Thay đổi hành vi của các neo
^và$. Thay vì khớp điểm đầu và cuối của toàn bộ văn bản, chúng sẽ khớp với đầu và cuối của từng dòng chữ. - DotAll (s): Thông thường, dấu chấm
.khớp với mọi ký tự trừ dấu xuống dòng. Cờ “s” cho phép dấu chấm khớp luôn cả các ký tự xuống dòng. - Unicode (u): Kích hoạt hỗ trợ Unicode toàn diện, cho phép bạn khớp chính xác các biểu tượng cảm xúc (emoji), ký hiệu đặc biệt, và các bảng chữ cái nước ngoài.
Hơn 50 Mẫu Regex thực tế: Các trường hợp sử dụng phổ biến
Việc tự nhớ và tự xây dựng regex có thể rất tốn thời gian. Công cụ của chúng tôi đi kèm với một thư viện mạnh mẽ được phân loại theo các bài toán thực tế. Hiểu được các ví dụ này chính là cách tốt nhất để học regex.
1. Kiểm tra (Validate) dữ liệu người dùng
Regex được sử dụng rất nhiều trong các form frontend và API backend để đảm bảo dữ liệu đầu vào của người dùng an toàn và được định dạng chuẩn xác.
- Email Validator: Một mẫu phức tạp kiểm tra định dạng email tiêu chuẩn, đảm bảo có phần tên, biểu tượng “@”, và một tên miền hợp lệ kèm dấu chấm.
- Mật khẩu mạnh (Strong Passwords): Sử dụng lookahead
(?=.*[A-Z])để ép buộc các quy tắc bảo mật. Nó có thể đảm bảo mật khẩu có ít nhất một chữ in hoa, một chữ in thường, một chữ số, một ký tự đặc biệt, và độ dài tối thiểu là 8 ký tự. - Tên đăng nhập (Usernames):
^[a-zA-Z0-9_-]{3,16}$đảm bảo username chỉ chứa chữ cái, số, dấu gạch dưới, hoặc dấu gạch ngang, và có độ dài từ 3 đến 16 ký tự. - Số điện thoại (Phone Numbers): Thư viện bao gồm các mẫu dành riêng cho việc phân tích số điện thoại Mỹ cũng như số điện thoại Việt Nam (ví dụ: khớp với đầu số +84 hoặc 03, 09).
- Thẻ tín dụng và CMND/CCCD: Nhận dạng an toàn các số thẻ Visa, MasterCard hoặc các số định danh chuẩn trong văn bản thô.
2. Phân tích Web và Mạng
Các kỹ sư dữ liệu và đội ngũ DevOps thường xuyên sử dụng regex để phân tích log hệ thống mạng và trích xuất dữ liệu web.
- Trích xuất URL: Tìm kiếm các liên kết HTTP và HTTPS hợp lệ ẩn bên trong những khối văn bản dài.
- Địa chỉ IPv4 và IPv6: Nhận diện chính xác các địa chỉ IP trong server log mà không bị nhầm lẫn với các số không hợp lệ như 256.0.0.1.
- Địa chỉ MAC: Xác thực các cặp hệ thập lục phân được phân tách bởi dấu hai chấm hoặc gạch ngang.
- URL Slug: Kiểm tra các đường dẫn URL chuẩn SEO chỉ chứa chữ cái in thường, số và dấu gạch ngang.
- ID Video YouTube: Trích xuất mã ID video gồm 11 ký tự duy nhất từ nhiều định dạng link YouTube khác nhau (watch, embed, youtu.be, shorts).
- Tài khoản Twitter/X: Trích xuất các lượt @mention từ văn bản trên mạng xã hội.
3. Định dạng Ngày và Giờ
Trích xuất dữ liệu thời gian từ các văn bản lộn xộn là một bài toán regex kinh điển.
- Ngày (YYYY-MM-DD): Lưu năm, tháng, ngày vào các named capture group riêng biệt, đồng thời kiểm tra phạm vi hợp lý (ví dụ: tháng từ 01-12).
- Ngày (DD/MM/YYYY): Khớp với các định dạng ngày tháng phổ biến ở Châu Âu và Châu Á (bao gồm Việt Nam).
- Thời gian (24h và 12h): Phân tích chính xác giờ và phút, phân biệt được định dạng SA/CH (AM/PM) và giờ quân sự.
- Thời lượng Video: Trích xuất định dạng MM:SS từ các danh sách phát phương tiện (playlist).
4. Code và Chẩn đoán lỗi IT
Regex rất cần thiết cho việc tái cấu trúc mã (code refactoring) và phân tích các dữ liệu có cấu trúc.
- Trích xuất Thẻ HTML: Tìm kiếm các thẻ HTML mở và đóng để cào dữ liệu (scrape data) từ các chuỗi DOM thô.
- Màu HEX: Nhận diện các mã màu CSS hex 3 chữ số và 6 chữ số (ví dụ: #FFFFFF).
- Token JWT: Kiểm tra cấu trúc 3 phần (Header, Payload, Signature) của JSON Web Tokens.
- UUID / GUID: Khớp với định dạng thập lục phân 8-4-4-4-12 tiêu chuẩn được dùng trong log cơ sở dữ liệu.
- Liên kết Markdown: Trích xuất riêng biệt phần text hiển thị và URL từ cú pháp Markdown
[text](url).
5. Chuỗi, Định dạng, và Toán học
Regex cực kỳ xuất sắc trong việc định dạng chuỗi chuyên sâu và kiểm tra tính hợp lệ của toán học.
- Định dạng Giá tiền (Price Formatting): Khớp các con số có dấu phẩy ngăn cách hàng nghìn và dấu chấm thập phân tùy chọn.
- Xóa khoảng trắng thừa: Tìm các vị trí có từ hai khoảng trắng trở lên
\s{2,}để bạn có thể thay thế chúng bằng một khoảng trắng duy nhất. - Trích xuất câu trích dẫn: Lôi ra phần văn bản nằm gọn bên trong cặp dấu ngoặc kép.
- Kiểm tra Số (Number Validation): Các mẫu nghiêm ngặt để xác định số nguyên, số thập phân, và địa chỉ bộ nhớ hệ thập lục phân.
- Tọa độ: Validate các cặp Vĩ độ và Kinh độ trong giới hạn địa lý chuẩn (từ -90 đến 90, từ -180 đến 180).
Biểu thức Chính quy trong các Ngôn ngữ Lập trình khác nhau
Mặc dù logic của regex là dùng chung ở mọi nơi, nhưng cách bạn triển khai nó sẽ thay đổi tùy thuộc vào ngôn ngữ lập trình. Bảng tra cứu (cheat sheet) của công cụ cung cấp hướng dẫn cú pháp cho các môi trường phổ biến nhất.
Regex trong JavaScript / TypeScript
JavaScript hỗ trợ sẵn biểu thức chính quy bằng cú pháp /pattern/ hoặc đối tượng RegExp.
regex.test(str): Trả về một giá trị boolean đơn giản cho biết liệu có khớp hay không. Rất hiệu quả khi dùng để validate dữ liệu.regex.exec(str): Trả về một mảng chứa kết quả khớp và các capture group. Cần phải sử dụng vòng lặp nếu dùng kèm cờ global.str.match(regex): Một phương thức chuỗi trả về mảng các kết quả khớp.str.matchAll(regex): Một phương thức hiện đại cực kỳ hữu ích, trả về một iterator chứa các đối tượng khớp chuyên sâu. Regex bắt buộc phải có cờ global ‘g’.str.replace(regex, replacement): Dùng để sửa đổi văn bản. Bạn có thể dùng$1trong chuỗi thay thế để chèn các capture group.
Regex trong Python
Python sử dụng thư viện tích hợp sẵn re cho mọi thao tác với biểu thức chính quy.
re.findall(pattern, string): Trả về một danh sách phẳng (flat list) chứa tất cả các chuỗi khớp.re.finditer(pattern, string): Trả về một iterator sinh ra các đối tượng khớp. Đây là tính năng tương đương với matchAll trong JS.re.search(pattern, string): Quét toàn bộ chuỗi và trả về vị trí đầu tiên mà regex tìm thấy kết quả khớp.re.sub(pattern, replacement, string): Phương thức chính dùng để thay thế văn bản trong Python.
Regex trong PHP
PHP xử lý regex thông qua các hàm PCRE (Perl Compatible Regular Expressions).
preg_match($pattern, $string): Trả về 1 nếu tìm thấy kết quả khớp, ngược lại là 0. Thường dùng để validate.preg_match_all($pattern, $string, $matches): Trích xuất toàn bộ các kết quả khớp và đưa vào mảng$matches.preg_replace($pattern, $replacement, $string): Thực hiện thao tác tìm kiếm và thay thế.preg_split($pattern, $string): Cắt (split) một chuỗi dựa trên ranh giới của biểu thức chính quy.
Regex trong Java
Java phụ thuộc vào gói java.util.regex, đòi hỏi một cách tiếp cận mang tính hướng đối tượng hơn.
Pattern.compile("pattern"): Biên dịch regex thành một đối tượng Pattern để có hiệu suất tốt hơn khi sử dụng nhiều lần.Matcher m = pattern.matcher("string"): Tạo một đối tượng Matcher thực hiện việc tìm kiếm thực sự.m.find(): Cố gắng tìm chuỗi con tiếp theo khớp với mẫu.m.group(1): Trích xuất nội dung của các capture group cụ thể.
Regex trong MySQL
Các cơ sở dữ liệu hiện đại cho phép bạn truy vấn dữ liệu bằng regex trực tiếp trong câu lệnh SQL.
WHERE column REGEXP 'pattern': Lọc ra các hàng (rows) khớp với regex.REGEXP_REPLACE(expr, pat, repl): Cho phép bạn thay đổi chuỗi trực tiếp ngay bên trong truy vấn SQL.REGEXP_SUBSTR(expr, pat): Trích xuất một chuỗi con cụ thể từ cột dữ liệu dựa trên regex.
Những Ưu điểm chính khi sử dụng Công cụ Regex Master
Tại sao bạn nên dùng một trình trực quan hóa (visualizer) chuyên dụng thay vì viết regex trực tiếp vào trình soạn thảo code của mình? Các tính năng được tích hợp trong Regex Master mang lại những lợi ích vô cùng rõ ràng.
- Ngăn chặn Lỗi chí mạng: Một regex viết kém có thể gây ra hiện tượng “catastrophic backtracking” (quay lui thảm họa), làm treo luôn ứng dụng của bạn. Hơn nữa, công cụ này đặc biệt kiểm tra xem mẫu của bạn có vô tình khớp với chuỗi rỗng khi đang bật cờ global hay không. Nếu có, nó sẽ đưa ra cảnh báo cú pháp thay vì khiến trình duyệt của bạn rơi vào một vòng lặp vô tận.
- Làm rõ các dữ liệu phức tạp: Khi làm việc với dữ liệu nhiều phần (như URL hay Ngày-Giờ), việc biết được đoạn dữ liệu nào sẽ rơi vào capture group nào thường khá rối rắm. Bảng “Groups Explorer” liệt kê một cách rõ ràng
Index,Độ dài (Length), và kết quả đầu ra của từng nhóm riêng lẻ thành một bảng có cấu trúc gọn gàng. - Kiểm tra thay thế an toàn: Thay thế văn bản bằng code có thể rất rủi ro nếu bạn không biết chính xác thứ gì sẽ bị thay đổi. Trình Thay thế (Replace Tester) sẽ bôi cam những văn bản mới được thay thế, cho phép bạn kiểm tra đầu ra bằng mắt thường trước khi đưa đoạn thay đổi đó vào code thực tế (production).
- Giảm thiểu việc phải chuyển đổi ngữ cảnh: Bằng cách tích hợp trình tạo code, một thư viện 50+ mẫu có sẵn, và một bảng tra cứu regex đồ sộ ngay trên cùng một màn hình, lập trình viên không cần phải liên tục chuyển tab để Google tìm kiếm các quy tắc cú pháp nữa.
Các sai lầm và hiểu lầm thường gặp về Regex
Ngay cả những lập trình viên nhiều kinh nghiệm cũng có thể mắc sai lầm khi làm việc với biểu thức chính quy. Dưới đây là một vài cạm bẫy phổ biến mà bạn nên tránh:
1. Quên thoát (Escape) các ký tự đặc biệt
Các ký tự như dấu chấm ., dấu sao *, dấu hỏi chấm ?, và ngoặc đơn () có ý nghĩa đặc biệt trong regex. Nếu bạn muốn tìm một dấu chấm thực sự ở cuối câu, bạn phải thêm ký tự thoát (dấu gạch chéo ngược) \.. Nếu quên làm điều này, dấu chấm sẽ khớp với mọi ký tự, dẫn đến kết quả sai (false positives).
2. Lạm dụng Quantifier tham lam (Greedy)
Dấu sao * và dấu cộng + mặc định là mang tính “tham lam” (greedy). Điều này có nghĩa là chúng sẽ “nuốt” càng nhiều văn bản càng tốt. Nếu bạn thử khớp các thẻ HTML bằng <.*> trên một chuỗi như <b>Hello</b>, regex sẽ khớp toàn bộ chuỗi từ dấu < đầu tiên đến dấu > cuối cùng, thay vì khớp với từng thẻ riêng lẻ. Để khắc phục, hãy dùng quantifier lười biếng (lazy quantifier): <.*?>.
3. Bỏ qua Ranh giới từ (Word Boundaries)
Nếu bạn muốn tìm từ “cat” (con mèo), việc sử dụng mẫu cat sẽ vô tình khớp luôn với các từ như “category” và “concatenation”. Để khớp chính xác một từ đứng độc lập, bạn phải sử dụng ranh giới từ (word boundaries): \bcat\b.
4. Hiểu sai về Cờ Multiline
Mặc định, ^ và $ sẽ khớp với điểm đầu và điểm cuối tuyệt đối của toàn bộ khối văn bản. Nếu bạn có một danh sách các mục phân tách bằng dấu xuống dòng, và bạn muốn khớp một thứ gì đó ở đầu của TỪNG dòng, bạn bắt buộc phải bật cờ Multiline (m).
Thực hành tốt nhất (Best Practices) để viết Regex hiệu quả
Viết được regex chạy ngon là tốt; nhưng viết regex dễ đọc và có hiệu suất cao còn tốt hơn nhiều.
- Dùng Non-Capturing Groups khi có thể: Nếu bạn chỉ đang dùng dấu ngoặc đơn để gom nhóm logic (như
(a|b)) và không cần trích xuất đoạn văn bản đó ra sau này, hãy dùng non-capturing group(?:a|b). Việc này giúp tiết kiệm bộ nhớ và cải thiện tốc độ xử lý. - Dùng Named Capture Groups: Thay vì dựa vào các số thứ tự index (như Group 1, Group 2), hãy đặt tên cho các nhóm của bạn bằng cách dùng
(?<year>\d{4}). Điều này giúp mã nguồn của bạn dễ đọc và dễ bảo trì hơn rất nhiều. - Giữ cho Regex đơn giản: Regex rất mạnh mẽ, nhưng nó không phải là một parser (bộ phân tích cú pháp). Đừng cố dùng regex để phân tích các tài liệu HTML lồng nhau sâu hay các chuỗi JSON phức tạp. Hãy dùng các thư viện phân tích cú pháp chuyên dụng cho dữ liệu có cấu trúc, và chỉ dùng regex cho việc kiểm tra, trích xuất chuỗi.
- Luôn kiểm tra với Edge Cases (Trường hợp ngoại lệ): Sử dụng vùng nhập chuỗi kiểm tra trong công cụ để đưa vào những dữ liệu BẮT BUỘC PHẢI SAI. Đảm bảo rằng regex của bạn từ chối được dữ liệu không hợp lệ cũng quan trọng không kém việc nó chấp nhận dữ liệu hợp lệ.
Kết luận
Làm chủ được biểu thức chính quy là một cột mốc quan trọng đối với bất kỳ lập trình viên, chuyên gia CNTT, hay chuyên viên dữ liệu nào. Mặc dù cú pháp ban đầu có vẻ đáng sợ, nhưng việc sử dụng một công cụ regex chuyên dụng sẽ xóa mờ khoảng cách giữa sự bối rối và tính rõ ràng. Với các tính năng như trực quan hóa regex theo thời gian thực, xem trước thay thế chuỗi trực tiếp, cùng một bảng tra cứu regex (cheat sheet) tương tác tích hợp sẵn, việc xây dựng các mẫu phức tạp sẽ trở thành một quy trình logic và trực quan thay vì một trò chơi đoán mò đầy ức chế.
Bằng cách tận dụng thư viện tích hợp sẵn với các bài toán phổ biến — từ validate email, mật khẩu cho đến phân tích URL và các đoạn code — bạn có thể tăng tốc đáng kể quy trình làm việc của mình. Hãy nhớ kiểm tra mẫu của bạn một cách kỹ lưỡng, chú ý tới các nhóm capture, sử dụng đúng cờ (flags), và tự động tạo code ngôn ngữ tương ứng ngay từ công cụ này. Hãy bắt đầu kiểm tra các chuỗi văn bản của bạn ngay hôm nay để biến regex trở thành một công cụ thiết yếu và “hết đau đầu” trong bộ kỹ năng lập trình của bạn!
