如何修复Swift中使用正则表达式校验密码导致的崩溃问题
错误根源
你遇到的报错由两类问题共同导致:
- 正则表达式本身存在语法错误
- Swift字符串转义规则处理不当
具体问题说明
- 正则未闭合正向断言的右括号,且特殊字符集中的
[、]、-、\未转义,导致正则引擎识别到未闭合的字符集,抛出U_REGEX_MISSING_CLOSE_BRACKET异常 - 你把总长度限制错误写在了特殊字符集后面,相当于要求特殊字符长度为8-32位,不符合需求
- Swift字符串中
\为转义符,要在正则中表示一个字面量\,普通字符串需要双重转义
修复方案
修正后的正则逻辑
四个正向断言分别校验必须包含的字符类型,末尾匹配整个字符串长度8-32位:^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[*.!@#$%^&(){}[\]:;<>,.?/~_+\-|\\]).{8,32}$
修正后的Swift代码
普通字符串写法:
var isPasswordValid: Bool { let passwordRegEx = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[*.!@#$%^&(){}[\\]:;<>,.?/~_+=\\-|\\\\]).{8,32}$" return NSPredicate(format: "SELF MATCHES %@", passwordRegEx).evaluate(with: self) }
如果使用Swift 5+的Raw字符串(推荐,无需额外处理\转义):
var isPasswordValid: Bool { let passwordRegEx = #"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[*.!@#$%^&(){}[\]:;<>,.?/~_+\-|\\]).{8,32}$"# return NSPredicate(format: "SELF MATCHES %@", passwordRegEx).evaluate(with: self) }
内容的提问来源于stack exchange,提问作者kakashi333
相关产品推荐
相关产品推荐

