Ich erstelle einen regulären Ausdruck für die Kennwortüberprüfung, der in einer Java-Anwendung als Konfigurationsparameter verwendet wird.
Der reguläre Ausdruck ist:
^.*(?=.{8,})(?=..*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$
Die Passwortrichtlinie lautet:
Mindestens 8 Zeichen
Enthält mindestens eine Ziffer
Enthält mindestens ein unteres Alpha-Zeichen und ein oberes Alpha-Zeichen
Enthält mindestens ein Zeichen innerhalb eines Satzes von Sonderzeichen (
@#%$^
usw.)Enthält kein Leerzeichen, keine Registerkarte usw.
Ich vermisse nur Punkt 5. Ich kann den regulären Ausdruck nicht auf Speicherplatz, Tabulator, Wagenrücklauf usw. überprüfen lassen.
Könnte mir jemand helfen?
Antworten:
Versuche dies:
Erläuterung:
Es ist einfach, einzelne Regeln hinzuzufügen, zu ändern oder zu entfernen, da jede Regel ein unabhängiges "Modul" ist.
Das
(?=.*[xyz])
Konstrukt frisst den gesamten String (.*
) und zieht sich zum ersten Vorkommen zurück, wo[xyz]
es übereinstimmen kann. Es ist erfolgreich, wenn[xyz]
es gefunden wird, andernfalls schlägt es fehl.Die Alternative wäre die Verwendung eines widerstrebenden Qualifikators :
(?=.*?[xyz])
. Für eine Passwortprüfung macht dies kaum einen Unterschied, für viel längere Zeichenfolgen könnte es die effizientere Variante sein.Die effizienteste Variante (aber am schwersten zu lesen und zu warten, daher am fehleranfälligsten) wäre
(?=[^xyz]*[xyz])
natürlich. Für einen regulären Ausdruck dieser Länge und für diesen Zweck würde ich es nicht empfehlen, dies so zu tun, da es keine wirklichen Vorteile hat.quelle
\\s
. Dies ist eine Java-Anforderung, keine Regex-Anforderung.(?=...)
Muster so zu halten , dass es mit dem Setup des restlichen Ausdrucks(?=\S+$)
) oder "enthält keine Leerzeichen" ((?!.*\s)
), ist eine Frage der Präferenz. Verwenden Sie, was Sie besser mögen. :)einfaches Beispiel mit Regex
Erklärungen:
(?=.*[0-9])
Eine Ziffer muss mindestens einmal vorkommen(?=.*[a-z])
Ein Kleinbuchstabe muss mindestens einmal vorkommen(?=.*[A-Z])
Ein Großbuchstabe muss mindestens einmal vorkommen(?=.*[@#$%^&+=])
Ein Sonderzeichen muss mindestens einmal vorkommen(?=\\S+$)
In der gesamten Zeichenfolge ist kein Leerzeichen zulässig.{8,}
mindestens 8 Zeichenquelle
Alle zuvor gegebenen Antworten verwenden dieselbe (richtige) Technik, um für jede Anforderung einen eigenen Lookahead zu verwenden. Sie enthalten jedoch einige Ineffizienzen und einen potenziell massiven Fehler, abhängig vom Back-End, das das Kennwort tatsächlich verwendet.
Ich beginne mit dem regulären Ausdruck der akzeptierten Antwort:
Erstens, da Java unterstützt
\A
und\z
ich diese lieber verwende, um sicherzustellen, dass die gesamte Zeichenfolge unabhängig von validiert wirdPattern.MULTILINE
. Dies wirkt sich nicht auf die Leistung aus, vermeidet jedoch Fehler beim Recycling von Regexen.Das Überprüfen, ob das Kennwort kein Leerzeichen enthält, und das Überprüfen seiner Mindestlänge können in einem einzigen Durchgang durchgeführt werden, indem alle auf einmal verwendet werden, indem ein variabler Quantifizierer
{8,}
in die Kurzform eingefügt wird\S
, die die zulässigen Zeichen begrenzt:Wenn das angegebene Kennwort ein Leerzeichen enthält, werden alle Überprüfungen durchgeführt, sodass die endgültige Überprüfung des Leerzeichens fehlschlägt. Dies kann vermieden werden, indem alle Punkte durch Folgendes ersetzt werden
\S
:Der Punkt sollte nur verwendet werden, wenn Sie wirklich ein Zeichen zulassen möchten. Verwenden Sie andernfalls eine (negierte) Zeichenklasse, um Ihren regulären Ausdruck nur auf die Zeichen zu beschränken, die wirklich zulässig sind. Obwohl es in diesem Fall kaum einen Unterschied macht, ist es eine sehr gute Angewohnheit , den Punkt nicht zu verwenden, wenn etwas anderes angemessener ist. Ich sehe viel zu viele Fälle von katastrophalem Backtracking, weil der Entwickler zu faul war, um etwas passenderes als den Punkt zu verwenden.
Da es eine gute Chance gibt, dass die ersten Tests in der ersten Hälfte des Passworts ein geeignetes Zeichen finden, kann ein fauler Quantifizierer effizienter sein:
Aber jetzt zum wirklich wichtigen Thema: Keine der Antworten erwähnt die Tatsache, dass die ursprüngliche Frage von jemandem geschrieben zu sein scheint, der in ASCII denkt. Aber in Java sind Strings Unicode. Sind Nicht-ASCII-Zeichen in Passwörtern zulässig? Wenn dies der Fall ist, sind nur ASCII-Leerzeichen nicht zulässig, oder sollten alle Unicode-Leerzeichen ausgeschlossen werden.
Standardmäßig werden
\s
nur ASCII-Leerzeichen abgeglichen, sodass die Umkehrung\S
mit allen Unicode-Zeichen (Leerzeichen oder nicht) und allen Nicht-Leerzeichen-ASCII-Zeichen übereinstimmt. Wenn Unicode-Zeichen zulässig sind, Unicode-Leerzeichen jedoch nicht, kann dasUNICODE_CHARACTER_CLASS
Flag angegeben werden,\S
um Unicode-Leerzeichen auszuschließen. Wenn Unicode-Zeichen nicht zulässig sind,[\x21-\x7E]
können sie stattdessen verwendet werden\S
, um alle ASCII-Zeichen abzugleichen, die kein Leerzeichen oder Steuerzeichen sind.Das bringt uns zum nächsten möglichen Problem: Wollen wir Steuerzeichen zulassen? Der erste Schritt beim Schreiben eines richtigen regulären Ausdrucks besteht darin, genau anzugeben, was Sie abgleichen möchten und was nicht. Die einzige technisch korrekte Antwort von 100% ist, dass die Kennwortspezifikation in der Frage nicht eindeutig ist, da nicht angegeben wird, ob bestimmte Zeichenbereiche wie Steuerzeichen oder Nicht-ASCII-Zeichen zulässig sind oder nicht.
quelle
Sie sollten nicht zu komplexe Regex verwenden (wenn Sie sie vermeiden können), da dies der Fall ist
Obwohl die Verwendung vieler kleiner regulärer Ausdrücke einen geringen Leistungsaufwand mit sich bringt, können die obigen Punkte ihn leicht übergewichten.
Ich würde so implementieren:
quelle
Passwortanforderung:
Kennwörter müssen Zeichen aus mindestens zwei (2) dieser Gruppierungen enthalten: Alpha-, numerische und Sonderzeichen.
Ich habe es getestet und es funktioniert
quelle
Für alle, die an Mindestanforderungen für jeden Charaktertyp interessiert sind, würde ich empfehlen, die folgende Erweiterung über Tomalaks akzeptierte Antwort vorzunehmen:
Beachten Sie, dass dies eine Formatierungszeichenfolge und nicht das endgültige Regex-Muster ist. Ersetzen Sie% d einfach durch die minimal erforderlichen Vorkommen für: Ziffern, Kleinbuchstaben, Großbuchstaben, Nicht-Ziffern / Zeichen und das gesamte Kennwort (jeweils). Maximale Vorkommen sind unwahrscheinlich (es sei denn, Sie möchten ein Maximum von 0, wodurch solche Zeichen effektiv abgelehnt werden), aber diese können auch leicht hinzugefügt werden. Beachten Sie die zusätzliche Gruppierung um jeden Typ, sodass die Min / Max-Einschränkungen nicht aufeinanderfolgende Übereinstimmungen ermöglichen. Dies wirkte Wunder für ein System, in dem wir zentral konfigurieren konnten, wie viele Zeichen jeder Art von Zeichen wir benötigten, und dann die Website sowie zwei verschiedene mobile Plattformen diese Informationen abrufen konnten, um das Regex-Muster basierend auf der obigen Formatierungszeichenfolge zu erstellen.
quelle
Dieser prüft auf jedes Sonderzeichen:
quelle
Java-Methode für Sie bereit, mit Parametern
Kopieren und fügen Sie einfach die gewünschten Parameter ein und stellen Sie sie ein.
Wenn Sie kein Modul möchten, kommentieren Sie es einfach oder fügen Sie ein "Wenn" hinzu, wie von mir für ein spezielles Zeichen
quelle
Verwenden Sie die Passay- Bibliothek, die eine leistungsstarke API ist.
quelle
Ich denke, das kann es auch (als einfacherer Modus):
[Regex Demo]
quelle
Einfaches
("^ (? =. * [0-9]) (? =. * [Az]) (? =. * [AZ]) (? =. * [\\ W _]) [\\ S] {8 , 10} $ ")
(? = irgendetwas) -> bedeutet, dass in allen Eingabezeichenfolgen ein positiver Blick nach vorne gerichtet ist und dass diese Bedingung geschrieben ist .sample (? =. * [0-9]) -> bedeutet, dass in die gesamte Zeichenfolge eine einstellige Zahl geschrieben ist. Wenn nicht geschrieben, geben Sie false zurück .
(?! Alles) -> (umgekehrt) bedeutet negative Blicke nach vorne , wenn Bedingung geschrieben Rückkehr falsch .
nahe Bedeutung ^ (Bedingung) (Bedingung) (Bedingung) (Bedingung) [\ S] {8,10} $
quelle
Erläuterung:
quelle
Auch Sie können dies tun.
quelle
Beispielcodeblock für sicheres Passwort:
quelle
RegEx ist -
quelle