2010-10-19 133 views
2

我對真正的正則表達式知之甚少。
我想要測試密碼驗證。這個正則表達式允許「*」嗎?

下面是描述它的正則表達式(我沒有寫出來,不知道是什麼意思):

private static string passwordField = "[^A-Za-z0-9_.\\[email protected]#$%^&*()=+;:'\"|~`<>?\\/{}]"; 

我已經試過像「dfgbrk*」,和我的代碼的密碼,使用上面的正則表達式,允許它。
這是否與正則表達式定義的可接受一致,還是與我的代碼有問題?

你能給我一個字符串的例子,驗證使用上述正則表達式是不是假設允許?

補充:這裏是原來的代碼如何使用這個表達式(和它的作品有):

public static bool ValidateTextExp(string regexp, string sText) 
      { 
       if (sText == null) 
       { 
        Log.WriteWarning("ValidateTextExp got null text to validate against regExp {0} . returning false",regexp); 
        return false; 
       } 

       return (!Regex.IsMatch(sText, regexp)); 
      } 

好像我做錯了..

感謝。

+1

提供您的其餘代碼。看看如何使用正則表達式會很有幫助。 – 2010-10-19 17:17:18

+0

該正則表達式包含字符類的否定(以'[^'開頭),因此它不應與您的'dfgbrk *'示例匹配。你可以顯示一些實際使用'passwordField'字符串的代碼嗎? – 2010-10-19 17:23:07

+0

爲什麼你想禁止密碼中的某些字符? – CodesInChaos 2010-10-21 18:57:47

回答

8

您的正則表達式匹配包含任何單個字符的值,該值是該列表中的而不是

您的測試值匹配,因爲它有空格,它似乎不在您的表達式中。

其原因是not是因爲你的角色類以^開頭。它匹配任何包含任何不是的單個字符的值的原因是因爲您沒有指定字符串的開始或結尾或任何量詞。

上述假設我絕不錯過中的人物湯:)

這個答案中間的任何字符的重要性也取決於你如何在實際代碼中使用正則表達式。


如果你的目的是爲正則表達式的字符串來表示實際上允許在密碼中的字符,你會改變的正則表達式,像這樣:

string pattern = "^[A-Z0-9...etc...]+$"; 

的重要組成部分有:

  • ^已從支架內部移除到外面;它表示整個字符串的開始。
  • $已被添加到結尾,它表示整個字符串的結尾。
  • 這些都是需要的,因爲否則,您的模式將匹配包含任何內部任何有效值的任何內容 - 即使無效值也存在。
  • 終於,我添加了+量詞,這意味着你想找到這些有效字符中的任何一個,一次或多次。 (此正則表達式不會允許一個長度爲0密碼)

如果你想允許^性格也作爲密碼的一部分,你想補充回來在括號之間,但只是*不如第一開頭的括號後面的東西[。因此,例如:

string pattern = "^[A-Z0-9^...etc...]+$"; 

^具有在不同時間的正則表達式不同的地方特殊的意義。

+1

是的,他們真的應該增加一個空間來表達。禁止使用空間不好。我有時候喜歡在我的密碼中使用尾隨的空格,以防意外打印出來。 – 2010-10-19 17:20:10

+0

空間在密碼:) – 2010-10-19 17:20:57

+0

#安德魯:非常感謝,我很確定現在我沒有在代碼中正確使用它,所以我只想知道它是什麼意思,以便我知道該怎麼做期待我的代碼返回(驗證或不是).. – 2010-10-19 17:24:04

5
[^A-Za-z0-9_.\[email protected]#$%^&*()=+;:'\"|~`?\/{}] 
----------------------^

對我來說看起來不錯,至少在你的問題標題方面。我還不清楚爲什麼你的樣本中的空間不會將它絆倒。

請注意,我假設此表達式的目的是查找無效字符。因此,如果表達式是正匹配,那麼您必須拒絕密碼錯誤。

bool isGoodPassword = !Regex.IsMatch(@"[^A-Za-z0-9_.\-!...]", requestedPassword); 

你可以重新寫了一個積極的匹配(不否定),像這樣:由於似乎對這個有些混亂,也許我可以用一點點僞代碼清除掉

bool isGoodPassword = Regex.IsMatch(@"^[A-Za-z0-9_.\-!...]+$", requestedPassword); 

新表達式匹配一個字符串,該字符串從字符串的開始處填充一個或多個列表中的任何字符,直到結束。任何不在列表中的字符都會導致匹配失敗。

+3

還有一個字符類否定。 – codaddict 2010-10-19 17:17:00

+1

@codaddict - 表達式也會否定所有字母數字字符,所以我很確定「這個表達式是否與任何無效字符相匹配?」 – 2010-10-19 17:18:16

+0

但是,正則表達式是從字符類'[^ A-Za-z'的否定開始的......所以它如何接受他的「dfgbrk *」我知道正則表達式很好,我很困惑 – 2010-10-19 17:20:34

4

你正則表達式只是一個倒序字符類,只描述一個單個字符(但不能是*)。所以這取決於你如何使用這個角色類。

2

取決於您如何應用它。它描述了一個字符,然而,^在開始的時候會給我一點兒困擾,因爲它禁止了其他任何角色,所以這裏可能有些可怕的東西。

編輯:正如在其他答案中指出的,你的字符串匹配的原因是空間,而不是被這條線取代的解釋。