Regular Expressions in VBA
20.08.2019 14:03:21
Bernd
ich versuche Passwörter zu erzeugen, die bestimmten Regeln unterliegen. Diese Regeln möchte ich als Regular Expression festlegen.
Dann soll ein Passwort generiert werden, das ebenfalls diesen Regeln entspricht
Und zum Schluss soll gegen ein Pattern geprüft werden, ob das Passwort tatsächlich so aufgebaut ist, wie es die Regeln wollen.
Sorry, ich bin neu in VBA und in Regex, daher bin ich hier noch nicht fündig geworden.
Wie muss die Regex aussehen, wenn folgende Regeln gelten:
Mindestens 1 Kleinbuchstabe
Mindestens 1 Großbuchstabe
Mindestens 1 Zahl
Mindestens 1 Sonderzeichen
Keine Whitespaces
Mindestens 8 Zeichen Länge.
Die Zeichen dürften überall im Passwort auftauchen.
Im Moment versuche ich das Passwort zu erzeugen, indem ich aus dem Gesamtstring "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + Sonderzeichen per Random bei jedem Durchlauf ein Zeichen rauspicke und zum Passwort zusammensetze.
Wie müsste die Regex für die Passwortregeln aussehen? und wie implementiere ich genau diese Regel in VBA? Die Schreibweisen unterscheiden sich anscheinend von Sprache zu Sprache.
Wie kann ich vergleichen, ob das Passwort dem Pattern entspricht?
Oder ist es vielleicht sogar möglich, anhand des Patterns gleich ein korrektes Passwort zu kreieren?
Mein Code bisher sieht leider sehr unschön aus:
Ich lasse per Random je ein Zeichen Uppercase, Lowercase, Zahl und Sonderzeichen extrahieren.
oneLower = Mid$(LOWER, Int(lowerLength * Rnd + 1), 1)
oneUpper = Mid$(UPPER, Int(upperLength * Rnd + 1), 1)
oneDigit = Mid$(DIGITS, Int(digitsLength * Rnd + 1), 1)
onePunctuation = Mid$(PUNCTUATION, Int(punctuationLength * Rnd + 1), 1)
Jeweils aus einem String für Uppercase, Lowercase.....
Die verbleibenden vier Zeichen erzeuge ich aus der Gesamtliste aller Zeichen.
For k = 1 To (passwordLength - 4)
tempPassword = tempPassword & Mid$(charList, Int(charListLength * Rnd + 1), 1)
Next
Und setze die einzelnen Zeichen plus die zusätzliche vier zu einem Passwort zusammen.
initialPassword = oneLower & oneUpper & oneDigit & onePunctuation & tempPassword
Damit man kein Muster erkennen kann, würfele ich alle Buchstaben darin nochmal in zufälliger Reihenfolge um:
Do While Len(initialPassword) größer 0
selectedChar = Int(Len(initialPassword) * Rnd + 1)
oneChar = Mid$(initialPassword, selectedChar, 1)
initialPassword = Replace(initialPassword, oneChar, "")
tempPassword = tempPassword & oneChar
initialPasswordLength = Len(initialPassword)
Loop
Diese Lösung funktioniert und ich kriege so konforme Passwörter auch ohne RegEx. Aber Regex wäre vermutlich schöner und eleganter, weil ich gleich ein Passwort in voller Länge erzeugen kann, und so lange gegen das Regex-Pattern vergleichen kann, bis es diesen Vorgaben entspricht.
Könnt ihr mir an der Stelle helfen?
Gruß
Bernd