2011-01-25 61 views
3

我在驗證ASP.NET MVC3應用程序的複雜性密碼。我目前的要求是它必須至少包含一個大寫字母,一個小寫字母,一個數字和不超過三個重複字符。我想盡可能概括這些數字,並且爲非字母數字字符添加條件。正則表達式以任意順序匹配多個模式

目前,我僅在服務器端進行驗證,所以我可以使用一個正則表達式針對每個條件多次調用Regex.IsMatch。儘管如此,我也希望能夠驗證客戶端。因爲不顯眼的jQuery驗證只會允許一個正則表達式,所以我需要將所有五個條件合併成一個模式。

對於正則表達式,我不太瞭解,但最近我一直在閱讀。我可能會遺漏一些簡單的東西,但是我找不到一種方法將多個模式結合在一起將或他們。

回答

9

您可以在一個單一的正則表達式與幾個lookahead assertions做到這一點(在.net中):如果所有條件都滿足

^(?=.*\p{Lu})(?:.*\p{Ll})(?=.*\d)(?=.*\W)(?!.*(.).*\1.*\1) 

將匹配。

^     # Match the start of the string 
(?=.*\p{Lu})  # True if there is at least one uppercase letter ahead 
(?=.*\p{Ll})  # True if there is at least one lowercase letter ahead 
(?=.*\d)   # True if there is at least one digit ahead 
(?=.*\W)   # True if there is at least one non-alnum character ahead 
(?!.*(.).*\1.*\1) # True if there is no character repeated twice ahead 

注意,比賽是不會消耗字符串的任何字符 - 如果你想匹配操作返回你對匹配的字符串,在正則表達式的末尾添加.*

在JavaScript中,您不能使用Unicode字符屬性。因此,您可以使用

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

這當然只會使用ASCII字母進行驗證。如果這對你沒問題,沒問題。你可以去擴充像[A-ZÄÖÜÀÈÌÒÙÁÉÍÓÚ]等字符類,但你可能永遠不會完成這個。在服務器端,如果你想驗證產生相同的結果,你必須指定RegexOptions.ECMAScript,所以.NET正則表達式引擎的行爲就像JavaScript引擎(感謝Alan Moore注意!)。

+0

我很難讓這個模式在Rubular上工作:http://rubular.com/r/008s20R3fa – 2011-01-25 08:54:50