【问题标题】:Validating password in JavaScript; RegEx在 JavaScript 中验证密码;正则表达式
【发布时间】:2010-11-09 21:31:13
【问题描述】:

在我正在使用的系统上,我们有一个 Password 类,它通过在以下条件下抛出异常来进行验证:

public Password(string password)
    : base(password)
{
    // Must contain digit, special character, or uppercase character

    var charArray = password.ToCharArray();

    var hasDigit = charArray.Select(c => char.IsDigit(c)).Any();
    var hasSpecialCharacter = charArray.Select(c => char.IsSymbol(c)).Any();
    var hasUpperCase = charArray.Select(c => char.IsUpper(c)).Any();

    if (!hasDigit && !hasSpecialCharacter && !hasUpperCase)
    {
        throw new ArgumentOutOfRangeException
             ("Must contain at least one digit, symbol, or upper-case letter.");
    }
}

如果我要在 JavaScript 中为 hasDigit、hasSpecialCharater 和 hasUpperCase 编写同样的检查,它会是什么样子?

JavaScript 没有这些相同的字符原型,所以我必须使用正则表达式,不是吗?

【问题讨论】:

  • Char.IsSymbol() 的实现并非易事。 (我刚刚使用 RedGate 反射器查看了 mscorlib.dll。)如果您希望 javascript 和 C# 实现精确匹配,最好在客户端和服务器上使用相同的正则表达式。

标签: c# javascript html regex


【解决方案1】:

这三个条件可以结合在一起:

if (/\d|\W|[A-Z]/.test(theString)) {
 ...

在哪里

  • \d → 1 位 (0-9),
  • \W → 1 个非单词字符(除 0-9、az、AZ 和 _ 之外的任何字符)这比 C# 的 IsSymbol匹配更多字符,以防密码支持 ASCII 以外的字符,
  • [A-Z] → 1 个大写字符

但与\d|\W|[A-Z] 不匹配的唯一字符是az,我们不妨直接写

if (/[^a-z]/.test(theString)) {

【讨论】:

  • 这与 OP 的要求不同。您正在检查密码是否包含数字、大写和特殊字符。他想检查它是否至少具有三个中的一个。
【解决方案2】:

有数字:

/\d/.test(password);

有大写:

/[A-Z]/.test(password);

有特殊字符:

/[^a-zA-Z0-9]/.test(password);

编辑.test.match好很多

【讨论】:

    【解决方案3】:

    您应该能够将所有测试组合成一个 JS 正则表达式:

    if (!passwordString.match(/[^a-z ]/)) {
        alert('Invalid password.');
        return false;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-10
      • 2011-05-06
      • 2016-10-19
      • 2011-03-24
      • 1970-01-01
      相关资源
      最近更新 更多