2012-01-09 15 views
-3

更新::

密碼強度:需要經常表達這種(C#)

  • 英文大寫字符(:

    從三個以下四個類別中包含的字符A到Z)

  • 英文小寫字母(a到z)
  • 10個基本數字(0〜9)
  • 非字母字符(例如,!,$,#,%

是否可以比較兩個字段值(進入)用正則表達式...如果是,那麼請在上面的列表中添加另一個條件。

  • 比較的用戶名密碼輸入,就必須不同
+0

必須使用單個正則表達式嗎?正則表達式是有限自動機處理器,您的需求至少需要一個下推自動機處理器。 – 2012-01-09 08:59:15

+0

使用String方法會很簡單。 – Acn 2012-01-09 08:59:33

+0

這需要一個單一的reg exp(上面提到) – RollerCosta 2012-01-09 09:03:08

回答

1

如果您需要做的是在一個表達式應該是這樣的:

^(?:(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])|(?=.*[a-z])(?=.*[A-Z])(?=.*[!%,.;:])|(?=.*[a-z])(?=.*[0-9])(?=.*[!%,.;:])|(?=.*[A-Z])(?=.*[0-9])(?=.*[!%,.;:])).{8,}$ 

看到它here on Regexr

積極向前看符號(在(?=.*[a-z]))用於檢查如果該字符串包含您想要的字符組。

這裏的問題是,你想要4分之3,這意味着你必須與所有允許的組合進行交替。

最後部分.{8,}然後匹配字符串並檢查至少8個字符。

^$是錨,將模式錨定到字符串的開始和結尾。

[!%,.;:]是一個字符類,在這裏你可以添加你想要包含的所有字符。對於所有標點符號,也許使用像\p{P}這樣的Unicode腳本更簡單。欲瞭解更多詳情,請參見這裏regular-expresssions.info

更新

比較的用戶名密碼輸入,就必須不同

通常,你應該能夠使用字符串連接來建立你的正則表達式。我不知道它是如何在你的情況,你把正則表達式...

是這樣的(僞)

String Username = "FooBar"; 
regex = "^(?:(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])|(?=.*[a-z])(?=.*[A-Z])(?=.*[!%,.;:])|(?=.*[a-z])(?=.*[0-9])(?=.*[!%,.;:])|(?=.*[A-Z])(?=.*[0-9])(?=.*[!%,.;:]))(?i)(?!.*" + Username + ").+$"; 

我在這裏也使用內聯修改(?i)到獨立的情況下與之相匹配。 (?!.*是負向前視的開始,這意味着該字符串不應該包含...

+0

字符串最多可以容納4個,上面提到的至少3個條件....並跳過至少8個字符長的條件 – RollerCosta 2012-01-09 09:22:44

+0

如果你不需要長度檢查,只需將'{8 ,}'用'+'表示至少一個或一個'*',它也接受空字符串。它會檢查至少3個條件。如果滿足所有4個條件,它不會受到傷害。 – stema 2012-01-09 09:24:44

+0

不要忘記檢查密碼是否包含帳戶名稱... – 2012-01-09 09:29:55

3

編輯:這個答案寫在編輯面前的問題。它最初包含了不包含用戶帳戶名稱的要求,並且至少需要8個字符。

鑑於您無論如何都需要將用戶的帳戶名稱用作其中的一部分,是否有任何理由將其作爲正則表達式來執行此操作?您可能希望使用正則表達式來表達這四種類型的模式(儘管也有其他方式),但我會分別編寫這些規則。例如:

// Categories is a list of regexes in this case. You could easily change 
// it to anything else. 
int categories = Categories.Count(regex => regex.IsMatch(password)); 
bool valid = password.IndexOf(name, StringComparison.OrdinalIgnoreCase) == -1 
      && password.Length >= 8 
      && categories >= 3;