4

在 PHP 中,我使用以下代码...

$passwordCapitalLettersLength = strlen(preg_replace("![^A-Z]+!", "", $password));
$passwordNumbersLength = strlen(preg_replace("/[0-9]/", "", $password));

...计算密码中出现了多少次大写字母和数字。

在 Objective C 中这个等价物是什么?

4

2 回答 2

7

您可以使用NSCharacterSet

NSString *password = @"aas2dASDasd1asdASDasdas32D";
int occurrenceCapital = 0;  
int occurenceNumbers = 0;
for (int i = 0; i < [password length]; i++) {
    if([[NSCharacterSet uppercaseLetterCharacterSet] characterIsMember:[password characterAtIndex:i]])
       occurenceCapital++;

    if([[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[password characterAtIndex:i]])
       occurenceNumbers++;

}
于 2012-11-21T15:57:52.613 回答
1

这可以使用 和 的功能相当简洁地完成NSStringNSCharacterSet而不需要手动迭代。

需要减 1,因为componentsSeparatedByCharactersInSet:总是会返回至少一个元素,并且该元素不会计算您的分离。

NSString* password = @"dhdjGHSJD7d56dhHDHa7d5bw3/%£hDJ7hdjs464525";

NSArray* capitalArr = [password componentsSeparatedByCharactersInSet:[NSCharacterSet uppercaseLetterCharacterSet]];
NSLog(@"Number of capital letters: %ld", (unsigned long) capitalArr.count - 1);

NSArray* numericArr = [password componentsSeparatedByCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]];
NSLog(@"Number of numeric digits: %ld", (unsigned long) numericArr.count - 1);

原始答案:虽然您提供的代码不会涵盖所有基础,但如果出于安全/风险原因需要继续使用这些正则表达式,您可以在下面这样做。

您可以在 Objective-C 中使用 RegEx。保存手动迭代字符串,并保持代码简洁。这也意味着因为您没有手动迭代,您可能会获得性能提升,因为您可以让编译器/框架编写者对其进行优化。

// Testing string
NSString* password = @"dhdjGHSJD7d56dhHDHa7d5bw3/%£hDJ7hdjs464525";

NSRegularExpression* capitalRegex = [NSRegularExpression regularExpressionWithPattern:@"[A-Z]"
                                                                              options:0
                                                                                error:nil];
NSRegularExpression* numbersRegex = [NSRegularExpression regularExpressionWithPattern:@"[0-9]"
                                                                              options:0
                                                                                error:nil];

NSLog(@"Number of capital letters: %ld", (unsigned long)[capitalRegex matchesInString:password
                                                                              options:0
                                                                                range:NSMakeRange(0, password.length)].count);
NSLog(@"Number of numeric digits: %ld", (unsigned long)[numbersRegex matchesInString:password
                                                                             options:0
                                                                               range:NSMakeRange(0, password.length)].count);
于 2012-11-21T16:09:01.443 回答