2016-09-17 2 views
2

Ich versuche, diese regulären Ausdrücke zu einem zu kombinieren. Weiß jemand, ob das möglich ist?Kombinieren Regex-Anweisungen zusammen

Im Grunde versuche ich zu überprüfen, ob eine Zeichenfolge einen Kleinbuchstaben, einen Großbuchstaben und eine Zahl hat.

(.*[a-z]+.*) 
(.*[A-Z]+.*) 
(.*[0-9]+.*) 

Also diese Strings, die alle

aA1 
a1A 
Aa1 
A1a 
1aA 
1Aa 

Beispiele würde passieren, die

aa1 
AA1 
a1a 
AAa 
a1 
1a 
1AA 
1A 
etc.. 
+0

Und "a1" würde fehlschlagen? Untersuchen Sie auch die Passwortkomplexität? Tu es nicht. – Schwern

+0

@Swwern ja, sollte es falsch zurückgeben ... warum nicht? Gibt es etwas, das mir fehlt? –

+1

Das Cracken von Passwörtern ist sehr anspruchsvoll geworden und die Zeiten, in denen eine Nummer in Ihrem Passwort Qualität bedeutet, sind längst vorbei. Verwenden Sie entweder einen Qualitäts-Passwort-Checker, oder stören Sie nicht. Sie fügen nur Komplexität hinzu und ärgern Leute, die gute Passwörter schreiben. Fragen Sie auf [Security.SE] (https://security.stackexchange.com/) nach weiteren Einzelheiten. – Schwern

Antwort

1

Eine sehr einfache Ansatz ist es, alle sechs Kombinationen aufzuzählen:

[a-z][A-Z][0-9]|[a-z][0-9][A-Z]|[A-Z][a-z][0-9]|[A-Z][0-9][a-z]|[0-9][a-z][A-Z]|[0-9][A-Z][a-z] 

Im Wesentlichen haben Sie Zeichen von drei Typen bekam - U pper, L ower und D igit. Die sechs Kombinationen sind

LUD|LDU|ULD|UDL|DLU|DUL 

Wie Sie sehen können, wird dies ziemlich schnell komplex. Wenn Sie es für die Passwortüberprüfung festlegen, ist das Ausführen der Zeichenklassenzählung in der Hostsprache eine bessere Wahl.

+0

Für bestimmte komplexe Werte von "sehr einfach". ;) – Schwern

+0

@Swwern Ich meine, das ist so einfach wie es geht: alles, was du tust, listet alle sechs hundert Optionen auf :-) – dasblinkenlight

1

Ja falsch zurückkommen würde, aber es ist böse. (Beispiele sind in Perl)

my $re = qr{(?: 
    ([a-z]+) | 
    ([A-Z]+) | 
    ([0-9]+) 
)+}x; 

Alle $1, $2 und $3 muss definiert werden (true wird es nicht geschnitten, weil 0 falsch ist).

$string =~ $re; 
print "Match" if defined $1 && defined $2 && defined $3; 

Sie sind besser für jedermanns Sache, halten es bei drei einfachen Regexes und schreiben ein Unterprogramm.

sub is_valid_string { 
    my $str = shift; 

    return 0 unless $str =~ /[a-z]/; 
    return 0 unless $str =~ /[A-Z]/; 
    return 0 unless $str =~ /[0-9]/; 

    return 1; 
} 
Verwandte Themen