iOS输入框手机号格式化代码中正则^符号的含义解释
正则中
^符号在当前代码里的作用 你看到的[^0-9]是正则表达式的字符组取反写法,这里的^放在方括号[]的首位时,含义是匹配所有不在方括号指定范围内的字符,和它在其他正则场景下的作用完全不同:
- 这行代码的实际效果是:把传入的电话号码字符串里所有不是0-9阿拉伯数字的字符,全部替换为空字符串,最终得到只包含纯数字的字符串,避免用户输入的空格、括号、横杠、特殊符号等内容干扰后续的掩码格式化逻辑。
- 注意不要和
^的其他用法混淆:- 如果
^写在方括号外面、正则表达式的最开头,它的作用是匹配整个字符串的起始位置,比如^1[3-9]就是匹配字符串开头的13-19号段手机号前缀 - 如果
^写在方括号内部但不是首位,比如[0-9^],它就只代表普通的脱字符^本身,没有特殊语义
- 如果
完整电话号码格式化代码逻辑说明
你贴的这套实现是iOS端UITextField实时格式化手机号的常用方案,核心逻辑是输入时实时提取纯数字,再按照指定掩码拼接格式字符,完整代码加注释如下:
// UITextField输入内容变化时的代理回调 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { guard let text = textField.text else { return false } // 先拿到输入变化后的完整字符串 let newString = (text as NSString).replacingCharacters(in: range, with: string) // 按照指定掩码格式化后赋值给输入框 textField.text = format(with: "+X (XXX) XXX-XXXX", phone: newString) // return false是因为我们已经手动给textField赋了格式化后的值,不需要系统再自动拼接输入内容 return false } // 掩码格式化核心方法 func format(with mask: String, phone: String) -> String { // 第一步:过滤所有非数字字符,拿到纯数字串 let numbers = phone.replacingOccurrences(of: "[^0-9]", with: "", options: .regularExpression) var result = "" var index = numbers.startIndex // 逐位遍历掩码,填充数字 for ch in mask where index < numbers.endIndex { if ch == "X" { // 遇到掩码里的X占位符,就填入下一位数字 result.append(numbers[index]) index = numbers.index(after: index) } else { // 掩码里的格式字符(+、空格、括号、横杠等)直接拼接 result.append(ch) } } return result }
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

