Menu

Kiểm thử regex

Kiểm thử biểu thức chính quy với hiệu ứng tô sáng kết quả khớp.

Tác giả Nethanel Bar, Co-founder & CEO

Cập nhật lần cuối

Sẵn sàng học code thật sự?

Coddy dạy bạn bằng cách viết code thật ngay trên trình duyệt: bài học tương tác, phản hồi tức thì và AI hỗ trợ khi bạn bị kẹt.

Regex tester là gì?

Regex tester cho phép bạn nhập một biểu thức chính quy và thấy ngay nó khớp với gì trong văn bản mẫu. Lập trình viên dùng regex (regular expression, biểu thức chính quy) để kiểm tra dữ liệu đầu vào, trích xuất dữ liệu từ chuỗi, tìm kiếm trong log, làm sạch văn bản, tạo lệnh trong trình soạn thảo và viết quy tắc tìm và thay thế.

Lúc đầu regex trông khó hiểu vì chỉ vài ký hiệu đã mang rất nhiều ý nghĩa. Một công cụ kiểm tra trực tiếp giúp mọi thứ sáng tỏ: mỗi ký tự bạn gõ đều cập nhật kết quả khớp được tô sáng và các nhóm bắt, nên bạn có thể thử nghiệm cho đến khi pattern làm đúng điều bạn muốn.

Mỗi ngôn ngữ lập trình dùng một engine regex hơi khác nhau (JavaScript, PCRE, Python, Java, Go, .NET). Phần cơ bản như ký tự, lớp ký tự, lượng từ, neo và nhóm hoạt động ở mọi nơi. Các tính năng nâng cao (lookbehind, nhóm có tên, lượng từ possessive) là chỗ các engine khác biệt.

Bạn sẽ học được gì khi kiểm tra regex

  • Một pattern mô tả *hình dạng* của văn bản, không phải ý nghĩa của nó. \d+ khớp với một dãy chữ số, nhưng không biết con số đó có hợp lý hay không.
  • Cờ thay đổi cách hoạt động: g tìm mọi kết quả khớp, i bỏ qua chữ hoa chữ thường, m khiến ^ và $ khớp với đầu và cuối dòng, s cho phép . khớp với ký tự xuống dòng.
  • Nhóm bắt (...) trích xuất từng phần của kết quả khớp, chứ không chỉ kiểm tra cả chuỗi có khớp hay không, rất cần thiết khi phân tích dữ liệu.
  • Lượng từ mặc định là *tham lam* (greedy, khớp nhiều nhất có thể). Thêm ? sẽ khiến chúng thành *lười* (lazy, khớp ít nhất có thể).

Cách dùng regex tester từng bước

  1. Nhập pattern

    Nhập biểu thức chính quy vào ô pattern. Đừng thêm hai dấu / bao quanh: đó là cú pháp literal của JavaScript, không phải một phần của pattern.

  2. Bật các cờ bạn cần

    Thường bạn sẽ cần g (tìm mọi kết quả khớp) và i (không phân biệt hoa thường). Dùng m để neo theo từng dòng và s để . khớp với ký tự xuống dòng.

  3. Dán chuỗi kiểm tra

    Đưa văn bản mẫu vào vùng kiểm tra. Kết quả khớp được tô sáng ngay khi bạn gõ, và các nhóm bắt được liệt kê bên dưới danh sách kết quả.

  4. Đọc bảng kết quả khớp

    Mỗi kết quả hiển thị vị trí, toàn bộ văn bản khớp và các nhóm bắt được. Dùng bảng này để chắc rằng pattern bắt đúng thứ bạn muốn và bỏ qua thứ bạn không cần.

  5. Tinh chỉnh cho đến khi đúng

    Siết chặt lượng từ, thêm neo (^, $) hoặc escape ký tự literal (\., \?) cho đến khi kết quả khớp và các nhóm đúng như code của bạn cần.

Bảng tra cứu nhanh regex

80% cú pháp regex mà bạn dùng trong 99% trường hợp. Lưu lại trang này, đây là cách nhanh nhất để nhớ cú pháp. Để xem đầy đủ ngữ pháp, hãy đọc hướng dẫn biểu thức chính quy của MDN.

Ký hiệuÝ nghĩaVí dụ
.Một ký tự bất kỳ (trừ ký tự xuống dòng)a.c khớp với abc, a-c
\d \DChữ số / không phải chữ số\d+ khớp với 123
\w \WKý tự từ (chữ cái/chữ số/_) / không phải ký tự từ\w+ khớp với hello_1
\s \SKhoảng trắng / không phải khoảng trắng\s+ khớp với dấu cách và tab
[abc]Một trong a, b hoặc c[aeiou] khớp với một nguyên âm
[^abc]Không phải a, b hay c[^0-9] khớp với ký tự không phải chữ số
* + ?0 lần trở lên, 1 lần trở lên, 0 hoặc 1 lần của phần trướca+ khớp với a, aaa
{n} {n,m}Đúng n lần / từ n đến m lần\d{3,5} từ 3 đến 5 chữ số
^ $Đầu / cuối chuỗi (hoặc dòng, khi có m)^Error dòng bắt đầu bằng Error
(...)Nhóm bắt(\d+) bắt các chữ số
(?:...)Nhóm không bắt(?:foo|bar) gom nhóm mà không bắt
a|bLựa chọn: a hoặc byes|no
\bRanh giới từ\bcat\b khớp với cat nhưng không khớp cats

Ví dụ regex để thử

Khớp dạng email đơn giản

Pattern
^[\w.+-]+@[\w-]+\.[\w.-]+$
Văn bản

learner@coddy.tech

Pattern này bắt được dạng cơ bản something@something.something. Kiểm tra email trong thực tế dễ dãi hơn nhiều; với biểu mẫu, hãy ưu tiên type="email" kèm kiểm tra ở phía máy chủ.

Trích xuất mọi con số trong một câu

Pattern
\d+
Văn bản

Lesson 12 has 3 tasks and 2 quizzes.

Với cờ g, pattern này tìm mọi dãy chữ số: 12, 3, 2. \d+ là cách regex nói "một hoặc nhiều chữ số".

Lấy id từ URL bằng nhóm bắt

Pattern
/users/(\d+)
Văn bản

/users/42/profile

Kết quả khớp đầy đủ là /users/42, còn nhóm bắt (\d+) chỉ trích ra 42. Nhóm bắt chính là cách bạn thật sự *dùng* kết quả khớp regex trong code.

Lượng từ tham lam và lượng từ lười

Tham lam
<.+>
Lười
<.+?>
Văn bản

<b>hello</b>

Phiên bản tham lam khớp với toàn bộ chuỗi <b>hello</b> vì .+ lấy nhiều nhất có thể. Phiên bản lười (+?) dừng ở dấu > đầu tiên, nên chỉ khớp với <b> và </b>.

Những lỗi regex thường gặp

  • Quên escape các ký tự đặc biệt: ., ?, +, (, ), [, ], {, }, \, ^, $, |. Khi muốn dùng chúng theo nghĩa đen, hãy thêm \ phía trước.
  • Viết pattern chạy đúng với một mẫu nhưng sai với dữ liệu thực tế có thêm dấu cách, xuống dòng hoặc thiếu trường.
  • Dùng .* kiểu tham lam và khớp nhiều hơn dự định; hãy chuyển sang .*? hoặc một lớp ký tự cụ thể hơn.
  • Cố phân tích các định dạng lồng nhau phức tạp (HTML đầy đủ, ngôn ngữ lập trình phức tạp, dấu ngoặc cân bằng) bằng regex. Hãy dùng một parser thật sự.
  • Quên cờ g rồi thắc mắc vì sao chỉ kết quả khớp đầu tiên được tô sáng.

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

Regex là gì?

Regex là viết tắt của *regular expression* (biểu thức chính quy), một ngôn ngữ pattern ngắn gọn để so khớp văn bản. Ý tưởng này có mặt trong gần như mọi ngôn ngữ lập trình cùng nhiều trình soạn thảo và công cụ dòng lệnh.

Làm sao để viết một regex?
Bắt đầu với các ký tự literal bạn muốn khớp, rồi thay các phần thay đổi bằng lớp ký tự (\d, \w, [abc]) và lượng từ (*, +, ?, {n,m}). Dùng regex tester để thử đi thử lại cho đến khi pattern khớp đúng những trường hợp bạn muốn.
\w trong regex nghĩa là gì?
\w khớp với một ký tự từ: chữ cái, chữ số hoặc dấu gạch dưới. \W thì ngược lại (bất kỳ ký tự nào không phải ký tự từ). Tập ký tự chính xác phụ thuộc vào engine và cờ Unicode.
Vì sao regex khớp nhiều hơn mong muốn?
Lượng từ mặc định là tham lam: .* khớp nhiều nhất có thể. Hãy chuyển sang lượng từ lười (.*?) hoặc dùng lớp ký tự cụ thể hơn để dừng đúng chỗ bạn muốn.
Regex trong JavaScript có giống mọi regex khác không?
Phần cơ bản giống nhau, nhưng các engine khác nhau. JavaScript, PCRE, re của Python, Java, Go và .NET đều hỗ trợ các cờ và tính năng nâng cao hơi khác nhau (hỗ trợ lookbehind, nhóm có tên, lượng từ possessive).
Người mới bắt đầu có nên học regex không?

Có, nhưng từ từ. Bắt đầu với ký tự literal, lớp ký tự, lượng từ, neo, cờ và nhóm bắt. Để lookaround, nhóm có tên và regex có điều kiện cho sau.

Tìm hiểu thêm

Công cụ lập trình khác

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu