如何验证必须包含数字或字母(或两者)以及特殊字符的密码?

How to validate a password which must contain either number or alphabets(or both) as well as special characters?

您好,我目前正在使用以下内容来验证密码,但我也想包含特殊字符。目前它只包含数字和字母。请帮忙。

 - (BOOL)validatePassword:(NSString *) password{
    NSString *ACCEPTABLE_CHARECTERS = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:ACCEPTABLE_CHARECTERS] invertedSet];
    NSString *filtered = [[password componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
    return [password isEqualToString:filtered];
}

您可以使用正则表达式来识别特殊字符的使用。喜欢

^([a-zA-Z+]+[0-9+]+[&@!#+]+)$

您也可以使用字符集来验证密码:- Check this link

你可以试试这个

- (BOOL)validatePassword:(NSString *) password{
    if(password.length == 0){
    return NO;
    }
    NSString *regex = @"^(?=(.*\d){2})(?=.*[a-zA-Z])(?=.*[!@#$%])[0-9a-zA-Z!@#$%]{8,}";
    NSPredicate *passwordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    return [passwordPredicate evaluateWithObject:password];
}

解释

(?=(.*\d){2}) - 使用先行 (?=) 并表示密码必须至少包含 2 位数字

(?=.*[a-zA-Z]) - 使用前瞻并表示密码必须包含字母

(?=.*[!@#$%]) - 使用前瞻并表示密码必须包含 1 个或多个定义的特殊字符

[0-9a-zA-Z!@#$%] - 指示允许的字符

{8,} - 表示密码长度必须至少为 8 个字符

可能需要稍微调整一下,例如准确指定您需要哪些特殊字符,但它应该可以解决问题。

-(BOOL)validatePassword:(NSString *) password{
    NSString *COMMON_CHARECTERS = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    NSString *SPECIAL_CHARECTERS = @"@#$%^&*";
    NSCharacterSet *cs_common = [NSCharacterSet characterSetWithCharactersInString:COMMON_CHARECTERS];
    NSCharacterSet *cs_special = [NSCharacterSet characterSetWithCharactersInString:SPECIAL_CHARECTERS];
    NSString *filtere_common = [[password componentsSeparatedByCharactersInSet:cs_common] componentsJoinedByString:@""];
    NSString *filtere_special = [[password componentsSeparatedByCharactersInSet:cs_special] componentsJoinedByString:@""];
    BOOL valid = (password.length == (filtere_common.length + filtere_special.length));
    return valid;
}