频道栏目
首页 > 资讯 > IOS > 正文

iOS开发:Swift里正则表达式的正确用法(限制TextField的文本输入,登录时判断正确的手机号)

17-06-12        来源:[db:作者]  
收藏   我要投稿
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.
    }
}

效果:
这里写图片描述

暂且就先写到这吧

相关TAG标签
上一篇:BP神经网络 c++实现
下一篇:LeetCode 279. Perfect Squares
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站