2016-09-17 47 views
2

我試圖將這些正則表達式合併爲一個。有人知道這是可能的嗎?將正則表達式組合在一起

基本上我試圖檢查一個字符串是否有小寫字母,大寫字母和數字。

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

所以這些字符串,將全部通過

aA1 
a1A 
Aa1 
A1a 
1aA 
1Aa 

例子都將返回false

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

而「a1」會失敗?另外,你是否檢查密碼的複雜性?不要這樣做。 – Schwern

+0

@Schwern是的,它應該返回false ...爲什麼不呢?有什麼我失蹤? –

+1

密碼破解已經變得非常複雜,並且密碼破解的時代已經過去了,那就是密碼意味着質量。要麼使用質量密碼檢查器,要麼不要打擾。你只會增加複雜性,並惹惱編寫好密碼的人。詢問[Security.SE](https://security.stackexchange.com/)以獲取更多詳細信息。 – Schwern

回答

1

一個非常簡單的方法是枚舉所有六種組合:

[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] 

從本質上講,你有三種類型的角色 - ü PPER,大號奧爾和d igit。這六種組合是:

LUD|LDU|ULD|UDL|DLU|DUL 

正如你所看到的,這很快變得複雜。如果您是通過密碼檢查進行操作的,則使用主機語言進行字符類計數是更好的選擇。

+0

對於「非常簡單」的某些複雜值。 ;) – Schwern

+0

@Schwern我的意思是,這大約是直接了當:你做的是列出所有六個選項:-) – dasblinkenlight

1

是的,但它是討厭的。 (實例是在Perl)

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

所有$1$2,並$3必須定義(真不會削減它因爲0爲假)。

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

爲了每個人的緣故,最好讓它保持在三個簡單的正則表達式並編寫子例程。

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; 
}