Để kiểm tra xem một chuỗi có chứa ký tự đặc biệt trong Swift, chúng ta có thể dùng câu điều kiện if-else hoặc switch, nhưng sẽ cần rất nhiều điều kiện, làm cho code dài và chậm. Trong bài này, chúng ta sẽ xem 2 phương pháp hiệu quả: Regular Expression (Regex) và CharacterSet.
Phương pháp 1: Sử dụng Regular Expression
Tạo extension cho String:
extension String {
var containsSpecialCharacter: Bool {
let regex = ".*[^A-Za-z0-9].*"
let testString = NSPredicate(format: "SELF MATCHES %@", regex)
return testString.evaluate(with: self)
}
}
Test:
override func viewDidLoad() {
super.viewDidLoad()
print("3r42323".containsSpecialCharacter) // false
print("!--%332".containsSpecialCharacter) // true
}
Kết quả:

Phương pháp 2: Sử dụng CharacterSet
Kiểm tra xem chuỗi có ký tự nào nằm ngoài tập cho phép (chữ cái, số) không:
let characterSet = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
if "3r42323".rangeOfCharacter(from: characterSet.inverted) != nil {
print("true") // Có ký tự đặc biệt
} else {
print("false") // Chỉ có chữ/số
}
if "!--%332".rangeOfCharacter(from: characterSet.inverted) != nil {
print("true")
} else {
print("false")
}
Kết quả:

So sánh
| Tiêu chí | Regex | CharacterSet |
|---|---|---|
| Độ phức tạp | Cần hiểu regex | Đơn giản, dễ hiểu |
| Hiệu năng | Chậm hơn một chút | Nhanh hơn |
| Linh hoạt | Rất cao (pattern phức tạp) | Giới hạn ở tập ký tự |
Khuyến nghị: Dùng CharacterSet cho trường hợp đơn giản (chỉ cho phép chữ/số). Dùng Regex khi cần quy tắc phức tạp (ví dụ: mật khẩu phải có chữ hoa, chữ thường, số, ký tự đặc biệt).