最近做一个项目,由于之前设计密码太过简单很容易被破解,所以升级了下密码的复杂度,要求密码有英文键盘下的数字,字母或字符至少两种,对密码字符串进行验证
思路是用正则表达式,使用NSPredicate对象的evaluateWithObject方法
废话不多说,直接上代码
匹配 数字,字母或符号至少两种的6-20位字的符串
+ (BOOL) isSafePassword:(NSString *)strPwd{
NSString *passWordRegex = @"^((?![0-9]+$)(?![a-zA-Z]+$)(?![~!@#$^&|*-_+=.?,]+$))[0-9A-Za-z~!@#$^&|*-_+=.?,]{6,20}$"; // 数字,字符或符号至少两种
NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", passWordRegex];
if ([regextestcm evaluateWithObject:strPwd] == YES)
{
return YES;
}
else
{
return NO;
}
}
其中 (?!pattern)是断言的一种它表示的意义不全是,是负向匹配
相关的还有:
(?=pattern)是正向匹配 ,意思是匹配pattern的串如Windows (?=95|98|NT|2000)可以匹配Windows2000不能匹配 WindowsXp
(?:pattern)匹配是pattern的内容,如ndustr(?:y|ies) 可以匹配'industry|industries'
运行结果:
参考链接:
http://www.itnose.net/detail/6335000.html 匹配数字和字母包含两种