Sie können eine Funktion definieren, um Ihre Anforderungen nacheinander zu überprüfen und einen Zähler zu erhöhen, um zu sehen, wie viele von ihnen tatsächlich erfüllt werden. Wenn mehr als 1 übereinstimmen und die Zeichenfolge zwischen 6 und 12 ist, wird das Kennwort übergeben.
NSUInteger checkPassword(NSString * haystack) {
NSArray * arr = [NSArray arrayWithObjects: @"(?s).*\\d.*", @"(?s).*[a-z].*", @"(?s).*[A-Z].*", @"(?s).*[[email protected]#$%^&*.,?].*",nil];
NSUInteger cnt = 0;
for (NSUInteger index = 0; index < [arr count]; ++index) {
NSPredicate * passTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", [arr objectAtIndex:index]];
if ([passTest evaluateWithObject:haystack]) {
cnt = cnt + 1;
}
}
if (cnt > 1 && [haystack length] > 5 && [haystack length] < 13)
{
return 1;
}
else
{
return 0;
}
}
und eine Probe IDEONE demo:
NSString * s = @"123DF4ffg";
NSLog(@"Result: %d", checkPassword(s));
// => Result: 1
Hinweis, dass es möglich ist, ein einzelnes Muster für das schreiben, aber es wird ziemlich lang und plump, wie Sie alle möglichen Paare definieren müssen von Lookahead-Alternativen.
Es wird sehr schwer sein, dies zu tun, nur mit einem regulären Ausdruck. Sie * können * in der Lage sein, dies zu tun, indem Sie mehrere nicht konsumierende präkonditionale Ausdrücke hintereinander stapeln. –
@ LasseV.Karlsen: Nicht schwer, nur wird es sehr peinlich aussehen. Jedoch ist * 6-12 Zeichen ** oder mehr *** nicht zutreffend. –
Ich würde diese Anforderungen für ein Paar für isolierte Regexps aufteilen. Sie würden jede Bedingung einzeln testen und einen Fehler anzeigen, wenn mehr als zwei nicht erfüllt wären. – PatNowak