6 Stimmen

Regex zum Abgleich mehrerer Muster in beliebiger Reihenfolge

Ich überprüfe ein Kennwort auf Komplexität in einer ASP.NET MVC3-Anwendung. Meine aktuellen Anforderungen sind, dass es mindestens einen Großbuchstaben, einen Kleinbuchstaben, eine Ziffer und nicht mehr als drei wiederholte Zeichen enthalten muss. Ich möchte diese Zahlen jedoch verallgemeinern und auch eine Bedingung für nicht alphanumerische Zeichen hinzufügen.

Derzeit validiere ich nur serverseitig, so dass ich in der Lage bin, Regex.IsMatch mehrere Male mit einem Regex für jede Bedingung aufzurufen. Ich möchte in der Lage sein, Client-seitig zu validieren, obwohl. weil unaufdringliche jQuery Validierung nur eine Regex zulässt, muss ich alle fünf Bedingungen in einem einzigen Muster zu kombinieren.

Ich weiß nicht viel, wenn es um reguläre Ausdrücke geht, aber ich habe in letzter Zeit ein wenig gelesen. Vielleicht übersehe ich etwas Einfaches, aber ich kann keine Möglichkeit finden, mehrere Muster auf die Weise UND zu verknüpfen, wie ein | sie ODER wird.

11voto

Tim Pietzcker Punkte 311448

Sie können dies (in .NET) mit mehreren Vorausschauende Behauptungen in einer einzigen Regex:

^(?=.*\p{Lu})(?:.*\p{Ll})(?=.*\d)(?=.*\W)(?!.*(.).*\1.*\1)

passt, wenn alle Bedingungen erfüllt sind.

^                  # Match the start of the string
(?=.*\p{Lu})       # True if there is at least one uppercase letter ahead
(?=.*\p{Ll})       # True if there is at least one lowercase letter ahead
(?=.*\d)           # True if there is at least one digit ahead
(?=.*\W)           # True if there is at least one non-alnum character ahead
(?!.*(.).*\1.*\1)  # True if there is no character repeated twice ahead

Beachten Sie, dass der Abgleich keine Zeichen der Zeichenkette verbraucht - wenn Sie möchten, dass der Abgleich die Zeichenkette zurückgibt, gegen die Sie abgleichen, fügen Sie .* am Ende der Regex.

In JavaScript können Sie keine Unicode-Zeicheneigenschaften verwenden. Stattdessen können Sie Folgendes verwenden

^(?=.*[A-Z])(?:.*[a-z])(?=.*\d)(?=.*\W)(?!.*(.).*\1.*\1)

die natürlich nur ASCII-Buchstaben zur Validierung verwendet. Wenn das für Sie in Ordnung ist, gut. Sie könnten die Zeichenklassen wie folgt erweitern [A-ZÄÖÜÀÈÌÒÙÁÉÍÓÚ] usw. usw., aber damit wären Sie wahrscheinlich nie vollständig. Wenn Sie auf der Serverseite wollen, dass die Validierung das gleiche Ergebnis liefert, müssen Sie Folgendes angeben RegexOptions.ECMAScript so dass sich die .NET-Regex-Engine wie die JavaScript-Engine verhält (danke Alan Moore für den Hinweis!).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X