代码之家  ›  专栏  ›  技术社区  ›  letsCode

检查UITextField是否仅限字符/数字

  •  0
  • letsCode  · 技术社区  · 5 年前

    let characterset = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-")
            if itemDescription.text!.rangeOfCharacter(from: characterset.inverted) != nil {
                print("string contains special characters")
                let message = MDCSnackbarMessage()
                message.text = "Numbers and letters only."
                MDCSnackbarManager.show(message)
                progressView.isHidden = true
                buttonSearchOutlet.isHidden = false
            }
    

    Hello
    hello
    hello1
    hello-
    

    我希望这是真的

    Hello!
    hello's
    hello1@
    hello$&@#
    

    我做错什么了?

    1 回复  |  直到 5 年前
        1
  •  2
  •   Leo Dabus    5 年前

    您可以简单地检查是否所有字符都满足某个条件,并检查包含有效字符的字符串是否包含这些字符。

    extension StringProtocol {
        var isLetterDigitOrHyphen: Bool {
            allSatisfy("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-".contains)
        }
    }
    

    let str = "Hello"
    if str.isLetterDigitOrHyphen {
        print("string is ok")
    } else {
        print("string contains special characters")
    }
    

    "Hello".isLetterDigitOrHyphen  // true
    "hello".isLetterDigitOrHyphen  // true
    "hello1".isLetterDigitOrHyphen  // true
    "hello-".isLetterDigitOrHyphen  // true
    
    "Hello!".isLetterDigitOrHyphen  // false
    "hello's".isLetterDigitOrHyphen  // false
    "hello1@".isLetterDigitOrHyphen  // false
    "hello$&@#".isLetterDigitOrHyphen  // false
    

    如果要使用正则表达式:

    extension StringProtocol {
        var isLetterDigitOrHyphen: Bool {
            range(of:"^[a-zA-Z0-9-]{1,}$", options: .regularExpression) != nil
        }
    }
    

    或使用字符集:

    extension StringProtocol {
        var isLetterDigitOrHyphen: Bool {
            unicodeScalars.allSatisfy(CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-").contains)
        }
    }
    

    extension String {
        static let validCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-"
    }
    

    extension StringProtocol {
        var isNotLetterDigitOrHyphen: Bool {
            !unicodeScalars.allSatisfy(CharacterSet(charactersIn: .validCharacters).contains)
        }
    }