更新::
密码强度:需要经常表达这种(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