Cách Sử Dụng “Character Class”
Trong bài viết này, chúng ta sẽ khám phá “character class” – một khái niệm quan trọng trong biểu thức chính quy (regular expression). Bài viết cung cấp 20 ví dụ sử dụng chính xác về cú pháp và có nghĩa, cùng hướng dẫn chi tiết về ý nghĩa, cách dùng, bảng biến đổi từ vựng, và các lưu ý quan trọng.
Phần 1: Hướng dẫn sử dụng “character class” và các lưu ý
1. Ý nghĩa cơ bản của “character class”
“Character class” (còn gọi là “character set”) là một tập hợp các ký tự bên trong dấu ngoặc vuông `[]` dùng để khớp với bất kỳ ký tự đơn lẻ nào trong tập hợp đó.
- Cú pháp: `[abc]` (khớp với ‘a’, ‘b’ hoặc ‘c’)
Ví dụ:
- `[aeiou]` (khớp với bất kỳ nguyên âm nào)
- `[0-9]` (khớp với bất kỳ chữ số nào)
2. Cách sử dụng “character class”
a. Khớp các ký tự cụ thể
- `[abc]`
Ví dụ: `[abc]at` khớp với “bat”, “cat”, “aat”, nhưng không khớp với “dat”.
b. Sử dụng phạm vi ký tự
- `[a-z]` (khớp với bất kỳ chữ cái thường nào từ a đến z)
Ví dụ: `[a-z]at` khớp với “bat”, “cat”, “dat”, “eat”, …, “zat”. - `[A-Z]` (khớp với bất kỳ chữ cái in hoa nào từ A đến Z)
Ví dụ: `[A-Z]at` khớp với “Bat”, “Cat”, “Dat”, “Eat”, …, “Zat”. - `[0-9]` (khớp với bất kỳ chữ số nào từ 0 đến 9)
Ví dụ: `[0-9]abc` khớp với “1abc”, “2abc”, “3abc”, …, “9abc”. - `[a-zA-Z0-9]` (khớp với bất kỳ chữ cái hoặc chữ số nào)
Ví dụ: `[a-zA-Z0-9]` khớp với “a”, “b”, “c”, …, “z”, “A”, “B”, “C”, …, “Z”, “0”, “1”, “2”, …, “9”.
c. Sử dụng ký tự phủ định
- `[^abc]` (khớp với bất kỳ ký tự nào *không* phải là ‘a’, ‘b’ hoặc ‘c’)
Ví dụ: `[^abc]at` khớp với “dat”, “eat”, nhưng không khớp với “bat”, “cat”, “aat”.
d. Biến thể và cách dùng trong câu
Dạng regex | Ví dụ | Ý nghĩa / Cách dùng | Kết quả khớp |
---|---|---|---|
`[aeiou]` | `[aeiou]t` | Khớp với ‘at’, ‘et’, ‘it’, ‘ot’, ‘ut’ | “at”, “et”, “it”, “ot”, “ut” |
`[0-5]` | `[0-5][0-9]` | Khớp với các số từ 00 đến 59 | “00”, “01”, “02”, …, “58”, “59” |
`[^0-9]` | `[^0-9]abc` | Khớp với bất kỳ ký tự nào không phải là số theo sau bởi “abc” | “aabc”, “babc”, “cabc”, … |
3. Một số cụm từ thông dụng với “character class”
- `d`: Tương đương `[0-9]` (khớp với chữ số).
- `w`: Tương đương `[a-zA-Z0-9_]` (khớp với ký tự chữ và số và dấu gạch dưới).
- `s`: Khớp với khoảng trắng (space, tab, newline).
4. Lưu ý khi sử dụng “character class”
a. Ngữ cảnh phù hợp
- Khi cần khớp một trong nhiều ký tự cụ thể.
Ví dụ: `[yY]es` khớp với “yes” và “Yes”. - Khi cần khớp một phạm vi ký tự.
Ví dụ: `[a-f]` khớp với “a”, “b”, “c”, “d”, “e”, “f”. - Khi cần loại trừ một số ký tự.
Ví dụ: `[^xyz]` khớp với bất kỳ ký tự nào không phải là “x”, “y”, “z”.
b. Phân biệt với các khái niệm khác
- “Character class” vs “Alternation (`|`)”:
– “Character class”: Khớp với *một* ký tự duy nhất từ tập hợp.
– “Alternation”: Khớp với *một* chuỗi con (substring) từ một tập hợp các chuỗi con.
Ví dụ: `[abc]` khớp với “a”, “b” hoặc “c”. / `(a|b|c)` khớp với “a”, “b” hoặc “c”. Trong trường hợp đơn giản này tương đương, nhưng alternation có thể khớp chuỗi dài hơn: `(red|blue)` khớp với “red” hoặc “blue”.
c. Dấu gạch ngang (`-`)
- Chỉ định phạm vi ký tự. Nếu bạn muốn bao gồm dấu gạch ngang thực tế trong character class, đặt nó ở đầu hoặc cuối. Ví dụ: `[-az]` hoặc `[az-]` khớp với “a”, “z” hoặc “-“.
5. Những lỗi cần tránh
- Quên đóng dấu ngoặc vuông:
– Sai: *`[abc`*
– Đúng: `[abc]` - Sử dụng dấu gạch ngang không đúng cách:
– Sai: *`[a-z0-9-]`* (có thể hiểu là “a” đến “z0”, rồi “9-” – không hợp lệ)
– Đúng: `[a-z0-9-]` hoặc `[a-z0-9-]` (dấu gạch ngang ở cuối) - Nhầm lẫn với alternation:
– Sai: Cố gắng dùng character class để khớp các chuỗi: *`[abc|def]`* (sai, vì sẽ khớp với “a”, “b”, “c”, “|”, “d”, “e”, “f”).
– Đúng: `(abc|def)` (khớp với chuỗi “abc” hoặc “def”).
6. Mẹo để ghi nhớ và sử dụng hiệu quả
- Hình dung: “Character class” như một “lớp” các ký tự được phép.
- Thực hành: Thử nghiệm với các phạm vi ký tự khác nhau.
- So sánh: Xác định xem bạn có cần *một* ký tự từ một tập hợp, hay *một chuỗi* từ một tập hợp các chuỗi.
Phần 2: Ví dụ sử dụng “character class” và các dạng liên quan
Ví dụ minh họa
- `[0-9]{3}-[0-9]{2}-[0-9]{4}` (Khớp với định dạng số điện thoại Mỹ: “123-45-6789”)
- `[a-zA-Z]+` (Khớp với một hoặc nhiều chữ cái)
- `[aeiouAEIOU]` (Khớp với bất kỳ nguyên âm nào, hoa hoặc thường)
- `[0-9a-fA-F]` (Khớp với một ký tự hex)
- `[+-]?d+` (Khớp với một số nguyên dương hoặc âm)
- `t[aeiou]t` (Khớp với “tat”, “tet”, “tit”, “tot”, “tut”)
- `[.!?,]` (Khớp với dấu chấm câu: dấu chấm, dấu chấm than, dấu chấm hỏi, dấu phẩy)
- `[ ]+` (Khớp với một hoặc nhiều khoảng trắng)
- `[^rn]+` (Khớp với một dòng văn bản không chứa ký tự xuống dòng)
- `[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}` (Khớp gần đúng với một địa chỉ email)
- `[1-9][0-9]*` (Khớp với một số nguyên dương không bắt đầu bằng số 0)
- `[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])` (Khớp gần đúng với định dạng ngày tháng năm YYYY-MM-DD)
- `[A-Za-z]{3,15}` (Khớp với tên người dùng có độ dài từ 3 đến 15 ký tự)
- `[Pp]ython` (Khớp với “Python” hoặc “python”)
- `[hH]ello, [wW]orld!` (Khớp với “Hello, World!”, “hello, World!”, “Hello, world!”, “hello, world!”)
- `[-+]?[0-9]*.?[0-9]+` (Khớp với số thực có dấu hoặc không dấu)
- `[a-zA-Z]+_[a-zA-Z]+` (Khớp với hai từ nối với nhau bằng dấu gạch dưới)
- `[^ws]` (Khớp với bất kỳ ký tự nào không phải chữ cái, số, gạch dưới hoặc khoảng trắng)
- `d{2}[./-]d{2}[./-]d{4}` (Khớp với định dạng ngày tháng DD/MM/YYYY, DD.MM.YYYY hoặc DD-MM-YYYY)
- “ (Khớp với thẻ HTML đơn giản)