2012-01-09 37 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;