iOS開發:Swift裡正則表達式的正確用法(限制TextField的文本輸入,登錄時判斷正確的手機號) – iPhone手機開發 iPhone軟體開發教學課程

iOS開發:Swift裡正則表達式的正確用法(限制TextField的文本輸入,登錄時判斷正確的手機號)。

首先從最基本的用法開始說起:

        let string = "ab123cdefg456hijk"

        let expression = "\\d"//創建表達式,\d是專門匹配數字的,等效於[0-9],註意:我們用的時候記得再前面多加個"\"。

        let regex = try! NSRegularExpression(pattern: expression, options: .allowCommentsAndWhitespace)//生成NSRegularExpression實例

        let numberOfMatches = regex.numberOfMatches(in: string, options:.reportProgress, range: NSMakeRange(0, (string as NSString).length))//匹配到數字的個數

        print(numberOfMatches)// 6

接下來結合實際需求來介紹,有時候我們需要限制輸入框隻能輸入特定的字符串,比如隻能輸入小數點後兩位,這裡我們需要調用 UITextField 協議裡的一個方法: func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool ,這個方法會在我們輸入文字的時候調用,如果返回 false 則輸入框不會顯示任何文字,我們就可以在這個方法裡對我們輸入的文字做正則匹配,如果不滿足就返回 false,代碼:

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        let str = (textField.text! as NSString).replacingCharacters(in: range, with: string)//獲取輸入框接收到的文字

        let expression = "^\\d*\\.?\\d{0,2}$"//創建表達式,"*"表示重復0次或更多次,"."表示匹配除換行符以外的任意字符,如果我們想直接匹配"."本身,就得在前邊加轉義符\\,"?"表示重復0或1次,{0,2}表示重復0或2次,"^","$"分別匹配字符串的開始和末尾,所以整個意思就是,匹配可重復出現的數字+一個"."+兩個數字

        let regex = try! NSRegularExpression(pattern: expression, options: .allowCommentsAndWhitespace)//生成NSRegularExpression實例

        let numberOfMatches = regex.numberOfMatches(in: str, options:.reportProgress, range: NSMakeRange(0, (str as NSString).length))//獲取匹配的個數

        return numberOfMatches != 0//如果匹配數量為0則表示不符合輸入要求
    }

再比如我們在寫手機登錄的時候,我們需要用戶輸入正確的手機號按鈕才能生效,具體實現方法:

class ViewController: UIViewController{
    var loginBtn:UIButton!
    var textField:UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        loginBtn = UIButton(frame: CGRect(x: 100, y: 150, width: 60, height: 40))
        loginBtn.setTitle("Login", for: .normal)
        loginBtn.backgroundColor = UIColor.lightGray
        loginBtn.isEnabled = false
        loginBtn.addTarget(self, action: #selector(login), for: .touchUpInside)
        view.addSubview(loginBtn)

        textField = UITextField(frame: CGRect(x: 100, y: 100, width: 200, height: 20))
        textField.borderStyle = .roundedRect
        textField.keyboardType = .numberPad//設置鍵盤類型為數字鍵盤
        view.addSubview(textField)

        NotificationCenter.default.addObserver(self, selector: #selector(textDidChange), name: .UITextFieldTextDidChange, object: nil)//觀察是否有文字輸入
    }

    func textDidChange(){
        if let str = textField.text{
            let expression = "^((13\\d)|(14[5|7])|(15([0-3]|[5-9]))|(18[^14]))\\d{8}$"//"|"表示什麼就不用說瞭吧,[5|7]表示滿足其中任意一個即匹配,數量唯一,"[0-3]"則表示滿足0到之間的數字即匹配,數量唯一,[^14]表示匹配除1和4以外的任意字符,這裡包括瞭字母,所以建議彈出鍵盤類型為數字鍵盤

            let regex = try! NSRegularExpression(pattern: expression, options: .allowCommentsAndWhitespace)//生成NSRegularExpression實例

            let numberOfMatches = regex.numberOfMatches(in: str, options:.reportProgress, range: NSMakeRange(0, (str as NSString).length))//獲取匹配的個數

            if numberOfMatches != 0{//如果匹配,則登錄按鈕生效,否則反之
                loginBtn.backgroundColor = UIColor.brown
                loginBtn.isEnabled = true
            }else{
                loginBtn.backgroundColor = UIColor.lightGray
                loginBtn.isEnabled = false
            }
        }
    }

    func login(){
        let alert = UIAlertController(title: nil, message: "login", preferredStyle: .alert)
        let confirm = UIAlertAction(title: "確認", style: .default, handler: nil)
        alert.addAction(confirm)
        present(alert, animated: true, completion: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

效果:
這裡寫圖片描述

暫且就先寫到這吧

發佈留言