2013-03-01 9 views
6

Könnte mir jemand mit einer Regex für ein Passwort mit den folgenden bitte helfen.Reg Ausdruck für starke Passwort erforderlich

mindestens zwei der folgenden:

ein Kleinbuchstabe
ein Großbuchstabe
eine Reihe
ein 'Sonderzeichen' (zB £, $, &, #)

+0

* mindestens zwei der folgenden * .. bedeutet, dass ein Passwort mit zwei Kleinbuchstaben und zwei Großbuchstaben gültig ist (ohne Zahlen usw.).) ist gültig? –

+0

Schauen Sie [hier] (http://stackoverflow.com/questions/2394092/regex-for-strong-password?rq=1) oder [hier] (http://stackoverflow.com/questions/1254952/regular-expression -for-password? rq = 1) oder vielleicht sogar [hier] (http://stackoverflow.com/questions/2370015/regular-expression-for-password-validation?rq=1). –

+0

Entschuldigung, das Passwort sollte 2 der 4 Zeichengruppen enthalten, also einen Kleinbuchstaben und eine Zahl oder einen Großbuchstaben und eine Nummer usw. –

Antwort

1

Wie Keith Thompson in einem Kommentar sagte, ich glaube nicht, dass eine einzige Regex hier wert ist.

wird der folgende Code tun, was Sie wollen, und ich denke, es ist besser lesbar, wartbar und einfacher ist, die Korrektheit als ein einzelner regulärer Ausdruck zu beweisen:

string password = "123abc"; 
string[] regexes = new[] 
    { 
     "[a-z]", //any lowercase word 
     "[A-Z]", //any uppercase word 
     @"\d", //any digit 
     @"\W" //special characters (or just [£$&#], adding the characters you want) 
    }; 
bool isValid = regexes.Count(regex => Regex.IsMatch(password, regex)) >= 2; 
+0

Danke an alle, ich habe ein Validierungsattribut erstellt und Oscars Vorschlag verwendet. –

4

Die folgendes sollte funktionieren:

^(?![a-z]*$|[A-Z]*$|\d*$|[\W_]*$).*$ 

Beispiel: http://www.rubular.com/r/effCmvehdx

Der negative Lookahead am Anfang wird dazu führen, dass dies fehlschlägt, wenn die gesamte Zeichenfolge nur aus einer Gruppe besteht.

Beachten Sie, dass, obwohl dies Ihren Anforderungen entspricht, dies keine sehr gute Regex für ein starkes Passwort ist. Wahrscheinlich möchten Sie auch eine Längenprüfung, und Sie sollten mindestens drei dieser Gruppen anstelle von zwei benötigen.

+0

hmm .. vermisse ich hier etwas? * enthalten mindestens zwei der folgenden * ... bedeutet, dass "abcABC" oder "abc123" gültig sein müssen. –

+0

@OscarMederos: Ja, und sie sind. Wo ist das Problem? –

+0

Es tut mir leid. Ich habe mit dem Regular Expression Designer von Rad Software getestet und es wurde nicht passend gefunden. Ich habe es mit C# getestet und gearbeitet. Könnten Sie Ihre Frage bearbeiten, damit ich meinen Downvote entfernen kann? –

1

Wie ich in einem Kommentar gesagt habe, ist ein Regex mit ziemlicher Sicherheit nicht das richtige Werkzeug für diesen Job. Es wird viel einfacher sein, Code zu schreiben, der über die Zeichen des Passworts iteriert und die Anzahl der Zeichen in jeder Klasse zählt.

Sie haben nicht definiert, was ein "Sonderzeichen" ist. Ich nehme an, dass es sich um ein beliebiges anderes Zeichen als einen Buchstaben oder eine Ziffer (einschließlich Leerzeichen und Steuerzeichen) handelt. Ich nehme auch an, dass sich "Buchstaben" nur auf die 26 Buchstaben des englischen Alphabets bezieht - was bedeutet, dass ein nicht-englischer Buchstabe wie ñ ein Sonderzeichen ist.

Um ein einfacheres Beispiel zu nehmen, sind Regexes nicht sehr gut darin, Dinge wie "foo und bar in beliebiger Reihenfolge" auszudrücken; Sie müssen beide Reihenfolge explizit angeben:

foo.*bar|bar.*foo 

In diesem Fall benötigen Sie 12 verschiedene Auswahlmöglichkeiten. I denke, das ist richtig, aber ich habe es nicht getestet.

[a-z].*[A-Z}|[A-Z].*[a-z}|[a-z].*[0-9]|[0-9].*[a-z]|[a-z].*[^a-zA-Z0-9]|[^a-zA-Z0-9].*[a-z]|[A-Z].*[0-9]|[0-9].*[A-Z]|[A-Z].*[^a-zA-Z0-9]|[^a-zA-Z0-9].*[A-Z]|[0-9].*[^a-zA-Z0-9]|[^a-zA-Z0-9].*[0-9] 

Dies ist ein Erep-Stil oder Perl-Regex. grep erkennt standardmäßig | nicht; Wenn Sie eine grep-style regexp benötigen, ersetzen Sie jede | durch \|.

Und wenn sich die Anforderungen ändern, sagen wir, mindestens 3 von 5 Klassen von Zeichen erfordern, müssen Sie die Regex vollständig neu schreiben; Sie können es nicht einfach zwicken.

Beachten Sie, dass Ihre Anforderungen immer noch Aa zulassen.

Verwandte Themen