Objective-c中的正则表达式无法正常工作

前端之家收集整理的这篇文章主要介绍了Objective-c中的正则表达式无法正常工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_404_6@ 我使用 Regex来检查密码.但它没有按预期工作.
我使用一些单元测试来检查正则表达式.

@implementation NSString (regexMatch)

- (BOOL)matchesRegex:(NSString *)regexPattern
{
    NSError *error = nil;

    NSRegularExpression* regex = [NSRegularExpression
                                  regularExpressionWithPattern:regexPattern 
                                  options:NSRegularExpressionSearch
                                  error:&error];

    if(error) 
    {
        NSLog(@"Error on maches regex: %@ on %@: %@",regex,self,error);
        return NO;
    }

    NSUInteger maches = [regex numberOfMatchesInString:self 
                                               options:NSRegularExpressionSearch 
                                                 range:NSMakeRange(0,[self length])];

    return (maches > 0);
}

@end

正则表达式:

const static NSString *REGEX_VALID_PASS = @"(^((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[-_,.@#$%'\"]).{6,20})$)";

单元测试:

//Password 
// At least:
//  - between 6 and 20 chars
//  - a capital character
//  - a small character
//  - a digit
//  - a special char: - _,. @ # $% ´ '
STAssertTrue([@"Pass1-" matchesRegex:REGEX_VALID_PASS],@"Password 1 Failed");

STAssertTrue([@"aPrettyLongPassw0rd@" matchesRegex:REGEX_VALID_PASS],@"Password 2 Failed");

STAssertTrue([@"Pw987321-_,.@#$%'`" matchesRegex:REGEX_VALID_PASS],@"Password 3 Failed");

//Returns TRUE ???
STAssertFalse([@"password1@" matchesRegex:REGEX_VALID_PASS],@"Wrong password 4 works (No capital letter)");

//Returns TRUE ???
STAssertFalse([@"PASSWORD2#" matchesRegex:REGEX_VALID_PASS],@"Wrong password 5 works (No small letter)");

STAssertFalse([@"Password8" matchesRegex:REGEX_VALID_PASS],@"Wrong password 6 works (No special letter)");

STAssertFalse([@"Password$" matchesRegex:REGEX_VALID_PASS],@"Wrong password 7 works (No digit letter)");

STAssertFalse([@"PrettyLongPasswordIsWrong123#" matchesRegex:REGEX_VALID_PASS],@"Wrong password 8 works (> 20)");

STAssertFalse([@"Pw@3" matchesRegex:REGEX_VALID_PASS],@"Wrong password 9 works (< 6)");

密码’password1 @’和’PASSWORD2#’返回TRUE但不正确.

错误

file://localhost/Users/user/app/AppTest.m: error: testRegex (AppTest) Failed: "[@"password1@" matchesRegex:REGEX_VALID_PASS]" should be false. Wrong password 4 works (No capital letter)

and


file://localhost/Users/user/app/AppTest.m: error: testRegex (AppTest) Failed: "[@"PASSWORD2#" matchesRegex:REGEX_VALID_PASS]" should be false. Wrong password 5 works (No small letter)

解决方法

您指定了NSRegularExpressionCaseInsensitive选项,因此表达式不区分大写和小写字母是有意义的.

使用指定的NSRegularExpressionCaseInsensitive选项,(?=.* [a-z])将匹配任何字母,包括大写字母;类似地,(?=.* [A-Z])也将匹配小写字母.

您的失败单元测试期望有不同的行为:它们都检查密码是否包含大写和小写字母,而输入包含相同大小写的字母.

猜你在找的Xcode相关文章