iOS开发:Swift里正则表达式的正确用法(限制TextField的文本输入,登录时判断正确的手机号)
程序员文章站
2022-05-14 09:54:20
ios开发:swift里正则表达式的正确用法(限制textfield的文本输入,登录时判断正确的手机号)。
首先从最基本的用法开始说起:
let string = &qu...
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. } }
效果:
暂且就先写到这吧