2014-01-18 67 views
1

我正在嘗試使用正則表達式來檢查MVC4數據註釋的密碼複雜性。我從一個簡單的正則表達式開始檢查長度,但以下內容不適用於任何長度的字符串。我犯了什麼錯誤?無法使用正則表達式在MVC4中檢查密碼長度

[RegularExpression(@"^(?=.{8,})$", ErrorMessage = "Password not strong enough")] 
[Required] 
[DataType(DataType.Password)] 
public string Password { get; set; } 
+1

爲什麼是正則表達式?只是使用'StringLength'屬性 –

+0

@ Selman22-看起來他似乎想強制執行一些複雜性要求(上限,下限,數值)以及長度,這是他的出發點。 – Tommy

+0

謝謝@湯米,那完全正確。我在使用它們之前試圖理解正則表達式。出於某種原因,我在網上找到的資源中沒有一個解釋說它和這裏的大多數帖子一樣好。 – Manish

回答

2

至於你想簡單的正則表達式的話,你可以只使用:

^.{8,}$ 

你不想正向查找(=?)。看到我的描述爲什麼這是最後的情況。

[StringLength(8, MinimumLength=1)] 

(注:托米在評論中指出的,你想一個正則表達式

對於簡單的字符串長度檢查,你可以,如果你正在使用asp.net 4.0只使用StringLength長度屬性爲完整的密碼檢查)。如果你正在尋找更復雜的密碼正則表達式,那麼我建議你看看tommy的回答,並開始herehere。 (?=)

爲什麼不起作用

  • ^ - 匹配字符串的開始。
  • .{8,} - 然後期待看看是否至少有8個字符。 (記住正向查找不會改變測試位置,所以這仍然是字符串的開始)。
  • 我們到底了($)?否 - >失敗。

另一個例子是.+(?=.{8,})$將會失敗,因爲存在着後面跟着8個字符,從測試位置的下一個字符在字符串中沒有這樣的位置是串$的結束。

最後一個例子是^.(?=.{7,})它將匹配(至少)8個字符的字符串的第一個字符。這是因爲只有第一個字符開頭^

+0

我不認爲你會希望密碼的最小長度爲1。我認爲他想要做的是a)確保它至少有8個字符,b)使用正則表達式,驗證密碼字符串的複雜性,如大寫,小寫,數字值。 – Tommy

+0

@Tommy - 他說他簡單的正則表達式不會在簡單的起始情況下執行最小字符串長度。這是因爲他的正則表達式不會那樣做 - 他正在使用前向查找,他不應該這樣做。 – acarlon

+0

我更多的引用了你對'StringLength'屬性的使用'(MinimumLength = 1)':) – Tommy

2

鑑於您想要驗證長度以及基於您的開頭句子的一些其他密碼複雜性規則,我建議您查看一些Regex blogs有關「密碼複雜性正則表達式「在互聯網上。例如,如果你想確保密碼是長度至少爲8-20個字符,幷包含一個上,一個小寫字母以及數字,你可以使用下面的正則表達式

((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,20}) 

這基本上休息我需要至少8個(不超過20個)字符,至少一個必須是數字,至少一個必須是az,並且至少一個必須是AZ。還有其他的例子和位可以放在一起。

爲了測試你的正則表達式,我會推薦一個正則表達式測試網站,例如http://regexhero.net/tester/。結合MSDN,您應該可以製作出一些非常漂亮的表情。

+0

非常感謝,我現在對這些表達式的含義有了更多的瞭解。 – Manish

+0

@Manish - 很高興幫助,這就是爲什麼我們在這裏。請記住,如果acarlon或我的回答爲您提供了所需的幫助,請將其標爲已接受(綠色複選標記:) :) – Tommy

+0

如果您閱讀了該博客條目,請務必閱讀[ridgerunner的評論](http://www.zorched。 net/2009/05/08/password-strength-validation-with-regular-expressions/comment-page-1 /#comment-17890)關於作者的正則表達式中的前導'。*'。這是一個非常常見的錯誤。 –