RegEx, um sicherzustellen, dass die Zeichenfolge mindestens ein Kleinbuchstaben, ein Großbuchstaben, eine Ziffer und ein Symbol enthält

156

Wie lautet der reguläre Ausdruck, um sicherzustellen, dass eine bestimmte Zeichenfolge mindestens ein Zeichen aus jeder der folgenden Kategorien enthält?

  • Kleinbuchstabe
  • Großbuchstabe
  • Ziffer
  • Symbol

Ich weiß , dass die Muster für einzelne Sätze nämlich [a-z], [A-Z], \dund _|[^\w](ich habe sie zu korrigieren, nicht wahr?).

Aber wie kombiniere ich sie, um sicherzustellen, dass die Zeichenfolge all diese in beliebiger Reihenfolge enthält?

Amarghosh
quelle
Welche Plattform / Regex-Dialekt? Barts Antwort ist richtig, aber Lookahead-Behauptungen sind beispielsweise in JavaScript nicht zuverlässig.
Bobince
Nirgendwo im Besonderen - ich lerne Regex. Gibt es eine Alternative, die in Javascript verwendet werden kann?
Amarghosh
@bobince Hey, ich versuche herauszufinden, warum Lookahead-Behauptungen in Javascript nicht zuverlässig sind. Gibt es eine Zusammenfassung dazu?
Chris Bier
@ ChrisB: Es gibt einen wirklich verwirrenden IE / JScript-Fehler: blog.stevenlevithan.com/archives/regex-lookahead-bug
Bobince

Antworten:

349

Wenn Sie einen einzelnen regulären Ausdruck benötigen, versuchen Sie:

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

Eine kurze Erklärung:

(?=.*[a-z])        // use positive look ahead to see if at least one lower case letter exists
(?=.*[A-Z])        // use positive look ahead to see if at least one upper case letter exists
(?=.*\d)           // use positive look ahead to see if at least one digit exists
(?=.*\W])        // use positive look ahead to see if at least one non-word character exists

Und ich stimme SilentGhost zu, \Wkönnte ein bisschen breit sein. Ich würde es durch einen Zeichensatz wie diesen ersetzen: [-+_!@#$%^&*.,?](Sie können natürlich noch mehr hinzufügen!)

Bart Kiers
quelle
Was würde passieren, wenn ich das letzte .+in ändere .*? Ich konnte keinen Testfall finden, der fehlschlägt .*. Sind sie in diesem Zusammenhang gleich? "Null oder mehr Zeichen" scheint in Ordnung zu sein - nur um Bestätigung zu bitten.
Amarghosh
@Amarghosh: In diesem Fall macht es keinen Unterschied. Aufgrund der positiven Vorausschau enthält die Zeichenfolge bereits mindestens 4 Zeichen. Es macht also keinen Unterschied, sich .+in .*oder sogar .{4,}in diese Angelegenheit zu verwandeln.
Bart Kiers
Wenn Sie bereit wären, eine kleine Erklärung hinzuzufügen, habe ich Probleme zu verstehen, wie die Kombination dieser Lookaheads garantiert, dass mindestens 1 von jedem Zeichensatz vorhanden ist
Sharlike
@Sharlike, ich weiß nicht, wie ich es umformulieren soll, um es verständlicher zu machen. Besonders in diesen kleinen Kommentarfeldern. Ich empfehle Ihnen, dies zu lesen: regulär-expressions.info / lookaround.html und wenn Sie noch Fragen haben, posten Sie einfach eine eigene Frage. Viel Glück!
Bart Kiers
4
@ikertxu, versuchen Sie so etwas:^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?!.*[&%$]).{6,}$
Bart Kiers
20

Bart Kiers, Ihre Regex hat ein paar Probleme. Der beste Weg, dies zu tun, ist folgender:

(.*[a-z].*)       // For lower cases
(.*[A-Z].*)       // For upper cases
(.*\d.*)          // For digits

Auf diese Weise suchen Sie, egal ob am Anfang, am Ende oder in der Mitte. In Ihrem Fall habe ich viele Probleme mit komplexen Passwörtern.

Juan Furattini
quelle
5
Sie suchen nicht nach Symbolen, wie vom OP angefordert.
Casimir
5

Sie können diese drei Gruppen separat zuordnen und sicherstellen, dass sie alle vorhanden sind. Auch [^\w]scheint ein wenig zu breit, aber wenn das , was Sie wollen Sie vielleicht , es ersetzen wollen \W.

SilentGhost
quelle
Vielen Dank. Ich war mir von \ W nicht bewusst. Ich habe es nur nachgeschlagen und festgestellt, dass es mit Not Word übereinstimmt. Gibt es einen Unterschied zwischen \ W und [\ W]? Ist [\ W] nur redundant?
Amarghosh
@Amarghosh, ja, \Wund [\W]führen zu dem gleichen.
Bart Kiers