Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> iOS

ตรวจสอบว่าสตริงมีตัวอักษรพิเศษหรือไม่ใน Swift

การตรวจสอบตัวอักษรพิเศษด้วย if-else หรือ switch จะซับซ้อน ใช้ Regular Expression หรือ CharacterSet เร็วกว่าและสะดวกกว่า

วิธีที่ 1: ใช้ Regular Expression

extension String {
    var containsSpecialCharacter: Bool {
        let regex = ".*[^A-Za-z0-9].*"
        let predicate = NSPredicate(format: "SELF MATCHES %@", regex)
        return predicate.evaluate(with: self)
    }
}

// ทดสอบ
print("3r42323".containsSpecialCharacter) // false
print("!--%332".containsSpecialCharacter) // true

วิธีที่ 2: ใช้ CharacterSet (แนะนำ - เร็วกว่า)

let allowedCharacters = CharacterSet.alphanumerics // A-Z, a-z, 0-9

func hasSpecialCharacter(_ string: String) -> Bool {
    return string.rangeOfCharacter(from: allowedCharacters.inverted) != nil
}

// ทดสอบ
print(hasSpecialCharacter("3r42323"))   // false
print(hasSpecialCharacter("!--%332"))   // true

การปรับแต่ง CharacterSet

// อนุญาตตัวอักษรไทย และอีโมจิ ด้วย
var customSet = CharacterSet.alphanumerics
customSet.insert(charactersIn: "แอปเปิ้ล🍎")

// หรือกำหนดเองทั้งหมด
let thaiAndAlphanumeric = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ก-ฮะ-์")

เปรียบเทียบประสิทธิภาพ

  • CharacterSet - เร็วกว่า ไม่ต้อง compile regex เหมาะสำหรับการเรียกบ่อย
  • Regex - ยืดหยุ่นกว่า สำหรับ Pattern ซับซ้อน

Extension ใช้งานง่าย

extension String {
    func containsSpecialCharacters(allowed: CharacterSet = .alphanumerics) -> Bool {
        return rangeOfCharacter(from: allowed.inverted) != nil
    }
}

// ใช้งาน
"Hello123".containsSpecialCharacters()           // false
"Hello@123".containsSpecialCharacters()          // true
"สวัสดี".containsSpecialCharacters(allowed: .alphanumerics.union(CharacterSet(charactersIn: "ก-ฮะ-์"))) // false