objective-c - NSPredicate 密码格式
问题描述
我正在尝试找出一个准确的解决方案来使用NSPredicate
. 这是我的代码:
-(int)checkPasswordStrength:(NSString *)password
{
NSPredicate *validPassword = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",@"\\b^(?=.*[0-9]+?)(?=.*[A-Z]+?)(?=.*[a-z]*?)(?=.*[!@#$%?]+?)[0-9A-z!@#$%?]{8,20}$\\b"];
NSString *escapedPassword = [NSRegularExpression escapedPatternForString:password];
if(![validPassword evaluateWithObject:escapedPassword]) {
[Helper showAlertWithTitle:@"" Message:@"Password should contain 8 to 20 alphanumeric characters, one capitalized letter, and with at least one of the symbols (e.g. !@#$%?)"];
return 0;
}
return 1;
}
我已经尝试了这些模式:
\\b^(?=.*[0-9]+?)(?=(.*\\d){1})(?=.*[a-zA-Z])(?=.*[!@#$%?]).*[0-9a-zA-Z!@#$%?]{8,20}\\b
\\b^(?=.*[0-9]+?)(?=.*[A-Z]+?)(?=.*[a-z]*?)(?=.*[!@#$%?]+?)[0-9A-z!@#$%?]{8,20}$\\b
\\b^(?=.*[0-9]+?)(?=.*[A-Z]+?)(?=.*[a-z]*?)(?=.*[!@#$%?]+?)[0-9A-z!@#$%?]{8,20}$\\b
...都没有转义和转义字符串,但它不仅适用于这种类型的密码模式(其中特殊字符位于第一个和最后一个密码字符串之后):
OverAndUnder21!
AreYouHere2?
PleaseDial9#
!4Ngrier!
!D4ngerZone
所有其他密码都有效:
P@MyF8fulDog
classM8s4L!fe
等等...
我试图在 regex101.com 中测试我的 RegEx 模式,它似乎完全匹配。
NSPredicate
允许特殊字符作为第一个和最后一个字符的正确验证模式是什么?
解决方案
您需要删除单词边界并在模式中添加一个问号:
@"^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%?])[0-9A-Za-z!@#$%?]{8,20}$"
请参阅正则表达式演示。
模式开头和结尾的单词边界要求第一个和最后一个 char 是单词 char(字母、数字或_
)。
此外,+?
在前瞻中不需要注意,因为您只需要至少 1 个模式实例。
推荐阅读
- windows - 允许计算机在从 Windows 应用程序播放音频时进入睡眠状态
- c++ - C++ 宏 - 传递字符串并用作变量名
- python - 每小时直方图 - matplotlib
- r - 根据向量元素的数量截断数据帧
- objective-c - 从 WKWebView 上传和下载文件时遇到问题
- javascript - 如何添加检查以使代码显示“密码太短”和“身高不是数字?”
- html - 如何在 Bootstrap 4 或 Bootstrap-vue 中突出显示前面的 Font Awesome 图标
- python - 不知道如何下载 pip/安装库
- vba - 为 MS Access 制作 QRCode ActiveX 控件:控件源属性
- android - 如何取消与 RxJava2 的通话?