Regex cho Người Mới Bắt Đầu: Cách Viết Biểu Thức Chính Quy
Regex cho Người Mới Bắt Đầu
Biểu thức chính quy — regex — là các mẫu mô tả văn bản. Với regex, bạn có thể tìm kiếm chuỗi, xác thực dữ liệu đầu vào, trích xuất dữ liệu và thực hiện tìm-kiếm-thay-thế (find-and-replace) phức tạp chỉ bằng một biểu thức gọn. Khi bạn hiểu các nguyên tắc cơ bản, regex trở thành một trong những công cụ mạnh mẽ nhất trong bộ công cụ lập trình của bạn.
Biểu Thức Chính Quy Là Gì?
Regex là một chuỗi các ký tự xác định một mẫu tìm kiếm. Mẫu \d{3}-\d{2}-\d{4} khớp số An sinh Xã hội Mỹ: ba chữ số, dấu gạch nối, hai chữ số, dấu gạch nối, bốn chữ số.
Các engine regex tồn tại trong hầu hết mọi ngôn ngữ lập trình — JavaScript, Python, Java, Ruby, Go — đều có hỗ trợ tích hợp sẵn.
Ký Tự Theo Nghĩa Đen (Literal Characters)
Hầu hết các ký tự khớp với chính chúng. Mẫu cat khớp chuỗi "cat" theo nghĩa đen ở bất cứ nơi nào nó xuất hiện.
Pattern: cat
Matches: "cat" in "The cat sat on the mat."
Matches: "cat" in "catalog"
Khớp theo nghĩa đen rất trực tiếp nhưng bị giới hạn. Sức mạnh thực sự đến từ các siêu ký tự (metacharacter).
Siêu Ký Tự (Metacharacters)
Các ký tự này có ý nghĩa đặc biệt và phải được escape bằng \ để khớp theo nghĩa đen:
. ^ $ * + ? { } [ ] \ | ( )
Lớp Ký Tự (Character Classes)
Lớp ký tự khớp một ký tự từ một tập hợp.
Ký Hiệu Ngoặc Vuông
| Mẫu | Khớp |
|---------|---------|
| [aeiou] | Bất kỳ nguyên âm nào |
| [0-9] | Bất kỳ chữ số nào |
| [a-zA-Z] | Bất kỳ chữ cái nào |
| [^0-9] | Bất kỳ ký tự nào KHÔNG phải là chữ số |
Các Lớp Được Định Nghĩa Trước
| Ký hiệu viết tắt | Mô tả |
|-----------|-------------|
| \d | Bất kỳ chữ số nào (giống [0-9]) |
| \w | Chữ cái, chữ số hoặc dấu gạch dưới |
| \s | Dấu cách, tab, dòng mới |
| \D | Bất kỳ ký tự không phải chữ số |
| \W | Bất kỳ ký tự không phải ký tự chữ |
| \S | Bất kỳ ký tự không phải khoảng trắng |
| . | Bất kỳ ký tự nào ngoại trừ dòng mới |
Bộ Định Lượng (Quantifiers)
Bộ định lượng kiểm soát số lần mà phần tử đứng trước phải xuất hiện.
| Bộ định lượng | Ý nghĩa | Ví dụ | Khớp |
|------------|---------|---------|---------|
| * | Không hoặc nhiều hơn | a* | "", "a", "aa" |
| + | Một hoặc nhiều hơn | a+ | "a", "aa", "aaa" |
| ? | Không hoặc một | colou?r | "color", "colour" |
| {3} | Chính xác N | \d{3} | "123" |
| {2,4} | Giữa N và M | \d{2,4} | "12", "123", "1234" |
Ví Dụ
\d+ → "42" trong "Answer is 42"
https?:// → "http://" và "https://"
Neo (Anchors)
Neo khớp các vị trí, không phải ký tự.
| Neo | Ý nghĩa |
|--------|---------|
| ^ | Bắt đầu chuỗi |
| $ | Kết thúc chuỗi |
| \b | Ranh giới từ |
| \B | Ranh giới không phải từ |
^hello → khớp "hello" chỉ ở đầu
end$ → khớp "end" chỉ ở cuối
\bword\b → khớp "word" như một từ trọn vẹn, không phải bên trong "sword"
Nhóm và Phép Tuyển (Groups and Alternation)
Nhóm bắt (capturing group) ( ) trích xuất các phần đã khớp:
(\d{3})-(\d{4}) → "555-1234", bắt "555" trong nhóm 1, "1234" trong nhóm 2
Nhóm không bắt (non-capturing group) (?: ) nhóm mà không trích xuất:
(?:https?|ftp):// → "http://", "https://", "ftp://"
Phép tuyển | hoạt động như OR:
cat|dog|bird → khớp "cat", "dog" hoặc "bird"
Ví Dụ Regex Thực Tế
| Trường hợp sử dụng | Mẫu |
|----------|---------|
| Điện thoại Mỹ | \d{3}-\d{3}-\d{4} |
| Email (đơn giản) | \S+@\S+\.\S+ |
| Địa chỉ IP | \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} |
| Hashtag | #[a-zA-Z]\w* |
| Thời gian (HH:MM) | [01]\d|2[0-3]:[0-5]\d |
Cách Kiểm Thử Một Mẫu Regex
Luôn kiểm thử các mẫu một cách tương tác:
- Nhập mẫu regex của bạn.
- Nhập một chuỗi kiểm thử.
- Xem các phần nào khớp trong thời gian thực.
- Điều chỉnh và lặp lại.
Sử dụng công cụ regex tester để thử nghiệm với các mẫu. Nó tô sáng các kết quả khớp, hiển thị các nhóm bắt và giúp bạn hiểu chính xác từng phần trong biểu thức của bạn làm gì.