密码8到64位大小写字母+数字+字符 不能包含空格

本文介绍了一种使用Objective-C实现的iOS应用中密码验证方法。该方法不仅检查密码是否为空,还确保密码不包含空格,并符合特定的复杂度要求,如包含大小写字母、数字及特殊字符等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#import "NSString+Extension.h"
#define NULLString(string) ((![string isKindOfClass:[NSString class]])||[string isEqualToString:@""] || (string == nil) || [string isEqualToString:@""] || [string isKindOfClass:[NSNull class]]||[[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length]==0)
@implementation NSString (Extension)
- (NSString *)validationPassword:(NSString *)password{

    // 判断密码不能包含空格 和要符合规则
    NSRange range = [password rangeOfString:@" "];
    NSString *validate = @"^(?=.*\\d)((?=.*[a-z])(?=.*[A-Z])(?=.*\\W).\\S{7,63})$";
    NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",validate];
    // 判断密码是否为空
    if (NULLString(password)) {
        return @"密码不能为空不符合规则";
    } else {
        if (range.location != NSNotFound) {
            return @"密码包含空格不符合规则";
        } else {
            if ([numberPre evaluateWithObject:password]) {
                return @"修改成功";
            } else {
                return @"密码不符合规则";
            }
        }
    }
    return nil;
}

@end
<think>好的,我现在需要帮用户解决一个关于Java正则表达式的问题。用户的需求是匹配包含大小写字母数字和特殊字符,但不包含汉字的字符串。我需要根据提供的引用内容来构造正确的正则表达式。 首先,用户提到的三个引用中,引用[1]提到使用[^\w]或者[^a-zA-Z0-9]来匹配非字母数字之外的字符,但这样会包括汉字和特殊字符。不过用户需要的是不包含汉字,所以可能需要排除汉字。引用[3]中有一个示例正则表达式,用来匹配中文、数字字母和下划线,使用的是[\u4e00-\u9fa5_a-zA-Z0-9]。这可能对构造排除汉字的正则有帮助。 用户希望匹配的字符集包括大小写字母数字和特殊字符,但不包含汉字。所以正则表达式需要允许字母大小写)、数字、特殊字符,同时排除任何汉字。汉字在Unicode中的范围是\u4e00到\u9fa5,所以需要使用否定字符类来排除这些字符。 通常,正则表达式中排除某些字符可以使用[^\u4e00-\u9fa5],这样任何非汉字的字符都会被匹配。但用户还需要进一步限制,只允许大小写字母数字和特殊字符。这时候需要组合两个条件:既要排除汉字,又要只包含允许的字符。 可能的思路是:使用一个字符类,包含所有允许的字符字母数字、特殊字符),同时排除汉字。但如何同时满足这两个条件呢?或者可能需要分步处理,比如首先确保字符串中没有汉字,然后再检查是否包含允许的字符。 另一种方法是,允许除汉字外的所有允许字符。即,将允许的字符集定义为字母数字、特殊字符,并且不包括汉字。这时候,正则表达式可能需要写成:^[a-zA-Z0-9\W_]*$,但这样可能不够准确,因为\W包括非单词字符,可能和下划线冲突。需要仔细分析。 根据引用[3],用户曾使用[\u4e00-\u9fa5_a-zA-Z0-9]来匹配中文、字母数字和下划线。但这里用户需要的是不包含中文,所以可能需要排除这些Unicode范围。 正确的正则表达式应该是:^[^\u4e00-\u9fa5]*$,这样整个字符串中不包含任何汉字。但用户还希望字符串只能包含大小写字母数字和特殊字符。因此,需要同时满足两个条件:所有字符都是允许的(字母数字、特殊字符),并且没有汉字。 所以,可以构造正则表达式为:^[a-zA-Z0-9\p{P}\p{S}]*$,其中\p{P}匹配标点符号,\p{S}匹配符号。但这样可能不够全面,或者需要结合排除汉字的部分。 或者,可以将允许的字符定义为所有非汉字字符中的特定集合。例如,使用^[^\u4e00-\u9fa5]*$来排除汉字,同时用另一个正则表达式来确保所有字符都属于允许的集合。 但可能更有效的方式是将两者合并,即字符类中包含所有允许的字符,并且排除汉字。例如,使用否定字符类排除汉字,同时限定其他允许的字符。例如:^[a-zA-Z0-9!@#$%^&*()_+=[\]{}|;:'",.<>/?`~-]*$。不过这样需要列出所有允许的特殊字符,可能不太方便。 另一种方法是,使用Unicode属性,例如\P{IsHan}来匹配非汉字字符。但Java的正则表达式是否支持这种语法需要确认。可能Java的正则引擎支持\p{InCJKUnifiedIdeographs}之类的,但可能更简单的方式是直接使用\u4e00-\u9fa5的范围排除。 所以,综合来看,正确的正则表达式应该是:^[a-zA-Z0-9\p{Punct}]*$,但需要排除汉字。这里可能需要结合排除汉字的条件和允许的字符。 或者,先确保字符串中没有汉字,然后检查是否由允许的字符组成。但正则表达式需要同时满足这两个条件。可以使用正向否定预查,比如: ^(?!.*[\u4e00-\u9fa5])[a-zA-Z0-9\p{Punct}]*$ 这可能有效。其中(?!.*[\u4e00-\u9fa5])确保整个字符串中没有汉字,然后后面的部分匹配允许的字符。 但可能需要更精确的字符范围。比如,允许大小写字母数字和一些特殊字符,如标点符号符号等。可以使用[\x21-\x7E],这个范围包含所有可打印的ASCII字符,但不包括汉字。不过这可能不够,如果用户允许其他Unicode特殊字符的话。 或者,用户可能希望允许所有特殊字符,只要不是汉字。所以正则表达式可以写成:^[^\u4e00-\u9fa5]*$,但这样可能允许其他非字母数字字符,比如日文、韩文等。但用户可能只希望允许大小写字母数字和特殊字符,但不包括其他非ASCII字符。 这可能需要更精细的控制。例如,允许ASCII范围内的字母数字和特殊字符,同时排除汉字。这时候正则表达式可以是:^[\x00-\x7F]*$,但这样只允许ASCII字符,其中当然不包括汉字。但这样可能无法满足用户需要包括所有特殊字符,而不仅仅是ASCII的。 或者,用户可能想允许任何字符,除了汉字。此时正则表达式就是^[^\u4e00-\u9fa5]*$,但可能还需要进一步限制只允许字母数字、特殊字符,而不包括其他非汉字的Unicode字符,比如日语假名等。这时候可能需要更复杂的表达式。 但根据用户的问题描述,用户可能只需要排除汉字,而允许其他所有可能的字符,包括特殊字符字母数字。这时候正确的正则表达式是:^[^\u4e00-\u9fa5]*$。但用户还提到需要匹配大小写字母数字、特殊字符,所以可能需要同时满足两个条件:字符串中的所有字符都是字母数字或特殊字符,并且没有汉字。 这时候,可以将正则表达式分解为两个部分:每个字符必须是字母数字或特殊字符,并且不能是汉字。例如,可以使用: ^(?=.*[a-zA-Z0-9\p{P}\p{S}])(?!.*[\u4e00-\u9fa5]).*$ 不过这可能不太正确。或者,更准确的是,每个字符都必须属于允许的集合,并且不属于汉字。例如,允许的字符包括大小写字母数字、特殊字符,而排除汉字。所以每个字符需要满足: [^\u4e00-\u9fa5] 并且属于 [a-zA-Z0-9\W_] 或者类似的。 或者,可能更好的方式是将允许的字符集定义为字母数字和特殊字符,同时排除汉字。这时候,正则表达式可以是: ^[a-zA-Z0-9\p{P}\p{S}]*$ 但这里需要确认是否覆盖了所有特殊字符,并且排除了汉字。不过,可能这样的写法仍然允许其他Unicode字符,比如带符号字母等,这取决于用户的需求是否严格。 可能用户需要的特殊字符指的是常见的标点符号等,所以可以明确列出允许的特殊字符。例如: ^[a-zA-Z0-9!@#$%^&*()_+\-=\[\]{};':"\\|,.<>/?]*$ 但这需要用户明确所有允许的特殊字符,可能不太方便。 结合引用中的信息,引用[3]中提到用户之前尝试过匹配中文、数字字母、下划线,使用[\u4e00-\u9fa5_a-zA-Z0-9]。现在用户需要排除中文,所以可以反过来,使用[^\u4e00-\u9fa5],但还需要确保只允许字母数字、特殊字符。 这时候,可能需要结合两个条件:字符串中的所有字符都不在汉字的Unicode范围内,并且所有字符都是允许的字母数字或特殊字符。例如,正则表达式可以是: ^[a-zA-Z0-9\W&&[^\u4e00-\u9fa5]]*$ 但Java中的正则语法是否支持这样的逻辑运算需要确认。或者,可能需要使用更复杂的结构。 另一种思路是:允许任何字符,只要不是汉字,并且属于字母数字或特殊字符。这里的特殊字符可能需要具体定义,比如标点符号符号等。 可能的解决方案是: ^[\p{Alnum}\p{Punct}]*$ 其中\p{Alnum}匹配字母数字,\p{Punct}匹配标点符号。这样组合起来可以覆盖字母数字和标点符号,同时排除了汉字,因为汉字的Unicode块不在这些类别中。不过需要验证Java中\p{Punct}的具体包含内容。 例如,在Java中,\p{Punct}包括!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~。而汉字的Unicode块属于\p{IsHan}或其他类别,所以不会被\p{Alnum}或\p{Punct}包含。因此,使用^[\p{Alnum}\p{Punct}]*$可能满足用户的需求:仅包含字母数字和标点符号,不包含汉字。 但需要验证这一点是否正确。例如,如果用户允许其他特殊字符空格,可能需要调整。或者,如果用户需要包含下划线,因为下划线属于\w,即\p{Alnum}可能包括它,所以可能需要根据具体情况调整。 例如,在引用[3]中,用户提到使用[a-zA-Z0-9_]来匹配字母数字和下划线。而如果使用\w,则包括下划线。所以如果正则表达式使用[\w\p{Punct}]*,则可能包含下划线和标点符号。但需要确认是否覆盖了所有需要的特殊字符,并排除汉字。 所以,最终的Java正则表达式可能是: ^[a-zA-Z0-9\p{Punct}]*$ 这样,字符串只能包含大小写字母数字和标点符号,而汉字不在其中。这应该满足用户的要求:匹配大小写字母数字、特殊字符,不包含汉字。 不过需要测试是否这个正则表达式确实排除了汉字。例如,输入"Hello123!"是合的,而"中文abc"则不合,因为包含汉字。 另外,可能还需要考虑字符串是否允许为空。如果允许空字符串,则使用*,否则使用+。 总结,正确的正则表达式应该是: ^[a-zA-Z0-9\p{Punct}]*$ 或者如果需要更明确的特殊字符,可能需要自定义字符类,比如: ^[a-zA-Z0-9!@#$%^&*()_+=\-\[\]{};':"\\|,.<>/?]*$ 但这样可能比较繁琐。使用\p{Punct}可能更方便,但需要确认其覆盖的符号是否合用户需求。 因此,最终答案可能是: String regex = "^[a-zA-Z0-9\\p{Punct}]*$"; 但需要转义反斜杠,所以在Java中应该写成: String regex = "^[a-zA-Z0-9\\p{Punct}]*$"; 这样就能匹配大小写字母数字和标点符号,不包含汉字。</think>要构造一个匹配大小写字母数字、特殊字符且不包含汉字的Java正则表达式,可以使用以下模式: $$^[a-zA-Z0-9\\p{Punct}]*$$ 该表达式含义如下: 1. `a-zA-Z`:匹配大小写字母 2. `0-9`:匹配数字 3. `\\p{Punct}`:匹配所有标点符号(如`!@#$%^&*`等)[^3] 4. `*`:允许空字符串或复出现 5. 通过限定字符集,天然排除了汉字字符(Unicode范围`\u4e00-\u9fa5`)[^1] 示例代码: ```java String regex = "^[a-zA-Z0-9\\p{Punct}]*$"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(inputStr); boolean isValid = matcher.matches(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值