2016-03-21 19 views
0

Ich brauche ein Passwort mit diesen Regeln zu überprüfen: Großbuchstaben, Kleinbuchstaben, Zahlen und Sonderzeichen:Regex Kennwortüberprüfung mit oder

Passwort 6-12 Zeichen und mindestens zwei der folgenden aufweisen müssen. Im Folgenden finden Sie meine aktuellen regex:

^((?=.*[a-z])|(?=.*[A-Z])|(?=.*\\d)|(?=.*(_|[[email protected]#$%^&*.,?]))).{6,12} 

über die ich kämpfen wie die ‚zumindest‘ Zustand zu machen.

+1

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. –

+1

@ LasseV.Karlsen: Nicht schwer, nur wird es sehr peinlich aussehen. Jedoch ist * 6-12 Zeichen ** oder mehr *** nicht zutreffend. –

+0

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

Antwort

0

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.

0

können Sie versuchen, mit diesem

^(?:(?=.*[a-z])(?:(?=.*[A-Z])(?=.*[\\d\\w])|(?=.*\\w)(?=.*\\d))|(?=.*\\w)(?=.*[A-Z])(?=.*\\d)).{6,12}$;