2014-03-12 57 views
0

在視圖模型中,我有以下正則表達式屬性,但它不起作用。密碼正則表達式 - 忽略匹配順序

[RegularExpression(@"(?=[A-Z]+)(?=[a-z]+)(?=[0-9]+)", ErrorMessage = "Password must contain digits as well as lower and upper case letters.")] 

因此,密碼字符串必須至少包含一個小寫字母,一個大寫字母和至少一個數字。

我看着 Regular Expressions: Is there an AND operator? 但我無法讓它工作。

任何幫助表示讚賞。謝謝。

回答

1

首先,你需要.*您先行條款內,使這些字符是在匹配的字符串的任何位置。沒有這些 - 所有這些角色都必須在你的字符串開頭。第二,你需要實際上有一個捕獲子句,否則你會得到一個空匹配 - 這將被視爲無效(爲什麼?見下文)。所以

(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9]* 

會給你匹配密碼的全部。你也可以在這裏查看密碼長度 -

(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9]{8,} 

會使密碼長度大於8個字符。


至於爲什麼你需要通過正則表達式捕獲的值時,RegexValidationAttributeIsValid(object value)方法使用以下邏輯語句返回如果輸入的值根據正則表達式是有效的。 (其中m是從給定的值給定模式的MatchstringValue爲給定值)

return (m.Success && m.Index == 0 && m.Length == stringValue.Length); 

View the source yourself

考慮,如果你具有.{3,8}的驗證正則表達式 - 這意味着三年之間的任何字符串八個字符的長度。您嘗試驗證值123456789。正則表達式匹配這個字符串! 12345678長度在三到八個字符之間!其實,23456789也是。和123,就此而言。只檢查比賽是不夠的,你必須進一步檢查整個值是否匹配。

+0

謝謝你的字符串長度提示呢! – erdinger

+1

樂意幫忙。如果不明確,該正則表達式的[A-Za-z0-9]部分假定這些是您的密碼數據唯一有效的字符集。你可能需要適當調整它,或者將它改爲'。{8,}',讓它接受任何長度爲8+的字符(仍然是三個前提條件匹配的地方)。 –

0

在您的環視中使用.*以符合您的情況。

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

不應該附加「。{3,}」(或最小字符長度的類似內容)以實際創建匹配嗎?這些前瞻只是斷言條件。我猜想最終不需要密碼字符串並不重要。 – tenub

+0

@tenub它不需要。因爲它會在字符串中尋找至少一個'A,a,0'。所以必須有三個字符。 –

+0

我在regexhero.net/tester/上試過這個正則表達式,它說有一個匹配「Password1」的例子,但它在我的應用程序中不起作用。 – erdinger