【问题标题】:Need a RegEx to put in my password validator需要一个正则表达式来输入我的密码验证器
【发布时间】:2017-04-13 09:53:39
【问题描述】:

正则表达式:至少 2 个大写字母、至少 2 个数字和至少 1 个特殊字符 (?.*!:)

我似乎在这里找不到解决方案(如果有,请原谅,但我已经搜索过但找不到)。基本上,我在 ASP.NET 中为我的家庭作业进行了网络聊天,唯一缺少的是检查密码强度。我有一个验证器,需要输入一个正则表达式来检查上述条件。我自己试过,但我真的很笨。

密码示例: paSSword?123

提前感谢您的帮助和解释:)

编辑: 到目前为止,我遇到了这样的事情,但它似乎不起作用。

^(?=.{8,50}$)(?=(.*[!?:.*]){1,})(?=(.*[A-Z]){2,})(?=(.*[a-z]))(?=(.*[0-9]){2,}).*

第一部分检查长度,第二部分检查提供的特殊字符,所以至少有一个..等等。

【问题讨论】:

  • 听从我教授的指示。我知道,这很愚蠢。最常见的限制是 1 位高位和 1 位数字,对吧?
  • 没错,这里是一个大写、一个特殊、一个数字(也是8个长度)的例子。 ^(?:(?=.*[a-z])(?:(?=.*[A-Z])(?=.*[\d\W])|(?=.*\W)(?=.*\d))|(?=.*\W)(?=.*[A-Z])(?=.*\d)).{8,}$。考虑到这是“我的教授的指示。”,您可能应该自己解决,因此我在这里写了一个类似的答案,而不是同一个
  • 哦,对了,完全忘记在描述中添加它了。我现在编辑了它。
  • 所以看起来您将输入限制为具有这些字符?.*!:,是否有理由让示例具有$

标签: c# asp.net regex passwords


【解决方案1】:

正则表达式不擅长计算字符串中出现的字母。您应该为此使用一些 LINQ:

int totalNumber = myPassword.Length;
int upperCaseChars = myPassword.Count(x => char.IsUpper(x));
int lowerDigitChars = myPassword.Count(x => char.IsNumber(x));
int specialChars = myPassword.Count(x => x == '.' || x == ':' || ...);
return upperCaseChars >= 2 && lowerCaseChars >= 2 and specialChars >= 1;

为了搜索特殊字符,您可以使用正则表达式:

var r = new Regex("[\?\.\*!:]");
int specialChars = myPassword.Count(x => r.IsMatch(x.ToString());

不过这似乎也很麻烦。

最后一种方法是使用char.IsSymbol 检查许多(但当然不是全部)特殊字符。如果这对你来说足够...

如果此解决方案不适合您,您还可以编写扩展方法来检查字符是否为特殊字符:

public static IsSpecial(this char c) 
{
    return c == '.' || c == ':' || ...
}

现在您可以按如下方式使用计数:

int specialChars = myPassword.Count(x => x.IsSpecial());

【讨论】:

  • 除了检查char.IsSymbol 之外,您也可以使用与我评论中的正则表达式相同的逻辑,拥有int specialChars = myPassword.Count(x => !(char.IsLower(x)) && !(char.IsUpper(x)) && !(char.IsNumber(x))); 尽管这可能不太可靠
  • @AlfieGoodacre 好吧,这比比较每个单个 cpecial 字符要好,因为它会很多。感谢您的提示。
  • 非常感谢您的努力。虽然我可以按照你的方式来做,这真的很方便(我已经想到了),但我认为鉴于我们昨天刚刚在课堂上介绍了这一部分,我们有必要通过 Visual Studio 验证器属性中使用的 RegEx 来做到这一点。
  • 那么我想到的就是将每个单个字符与我已经提到的正则表达式进行比较,但是你仍然需要Count。没有真正的 pattern 正则表达式可以评估。您的所有字符都可以以任意顺序出现,因此几乎不可能在此处使用正则表达式。
猜你喜欢
  • 1970-01-01
  • 2022-11-25
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多