2012-05-15 2 views
4

암호를 확인하기 위해 Regex를 사용합니다. 그러나 의도 한대로 작동하지 않습니다. 일부 단위 테스트를 사용하여 정규식을 확인합니다.Objective-c의 정규식이 의도 한대로 작동하지 않습니다.

@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])(?=.*[-_,[email protected]#$%'\"]).{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([@"[email protected]" matchesRegex:REGEX_VALID_PASS], @"Password 2 failed"); 

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

//Returns TRUE ??? 
STAssertFalse([@"[email protected]" 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([@"[email protected]" matchesRegex:REGEX_VALID_PASS], @"Wrong password 9 works (< 6)"); 

비밀번호 '가 password1 @'와 '암호 2 번호는'TRUE 반환되지만 올바른가 없습니다.

오류 :

file://localhost/Users/user/app/AppTest.m: error: testRegex (AppTest) failed: "[@"[email protected]" 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) 
+1

문제 외에도 대괄호 '^ (? =. * \\ d) (? =. * [az]) (? =. * [AZ]) (? =. * [ {6,20} $'같은 것을 할 것입니다. – stema

+0

서버 측에서 복사했습니다. 변경하기 전에 먼저 작동시키고 싶었습니다. Regex.하지만 고맙습니다. – Justin

답변

3

당신은 NSRegularExpressionCaseInsensitive 옵션을 지정, 그래서식이 대문자와 소문자를 구별하지 않는다는 의미가 있습니다.

NSRegularExpressionCaseInsensitive 옵션을 지정하면 (?=.*[a-z])은 대문자를 포함한 모든 문자와 일치합니다. 마찬가지로 (?=.*[A-Z])도 소문자와 일치합니다.

실패한 단위 테스트에서는 다른 동작이 예상됩니다. 둘 다 대문자와 소문자가 포함되어 있는지 확인하는 반면, 입력에는 대소 문자가 포함되어 있습니다.

+0

아, 아주 간단했습니다. 감사합니다. NSRegularExpressionSearch로 변경했습니다. – Justin