更新::
密碼強度:需要經常表達這種(C#)
- 英文大寫字符(:
從三個以下四個類別中包含的字符A到Z)
- 英文小寫字母(a到z)
- 10個基本數字(0〜9)
- 非字母字符(例如,!,$,#,%
是否可以比較兩個字段值(進入)用正則表達式...如果是,那麼請在上面的列表中添加另一個條件。
- 比較的用戶名密碼輸入,就必須不同
更新::
密碼強度:需要經常表達這種(C#)
從三個以下四個類別中包含的字符A到Z)
是否可以比較兩個字段值(進入)用正則表達式...如果是,那麼請在上面的列表中添加另一個條件。
如果您需要做的是在一個表達式應該是這樣的:
^(?:(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])|(?=.*[a-z])(?=.*[A-Z])(?=.*[!%,.;:])|(?=.*[a-z])(?=.*[0-9])(?=.*[!%,.;:])|(?=.*[A-Z])(?=.*[0-9])(?=.*[!%,.;:])).{8,}$
積極向前看符號(在(?=.*[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)
到獨立的情況下與之相匹配。 (?!.*
是負向前視的開始,這意味着該字符串不應該包含...
字符串最多可以容納4個,上面提到的至少3個條件....並跳過至少8個字符長的條件 – RollerCosta 2012-01-09 09:22:44
如果你不需要長度檢查,只需將'{8 ,}'用'+'表示至少一個或一個'*',它也接受空字符串。它會檢查至少3個條件。如果滿足所有4個條件,它不會受到傷害。 – stema 2012-01-09 09:24:44
不要忘記檢查密碼是否包含帳戶名稱... – 2012-01-09 09:29:55
編輯:這個答案寫在編輯面前的問題。它最初包含了不包含用戶帳戶名稱的要求,並且至少需要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;
必須使用單個正則表達式嗎?正則表達式是有限自動機處理器,您的需求至少需要一個下推自動機處理器。 – 2012-01-09 08:59:15
使用String方法會很簡單。 – Acn 2012-01-09 08:59:33
這需要一個單一的reg exp(上面提到) – RollerCosta 2012-01-09 09:03:08