【问题标题】:On Demand Regular Expression for Password密码的按需正则表达式
【发布时间】:2014-08-27 06:54:49
【问题描述】:

我需要为密码做一个正则表达式,其强度设置可以由客户端更改。 强度参数如下——

最小和最大长度可以由 AngularJS ngMinlength 和 ngMaxlength 处理。

但我需要生成一个正则表达式,它将通过从数据库中获取的参数即时创建。

我可以像这样从 JSON 中获取这些参数:

var minCharLength = pwdJSON.minCharLength;
var minCapCharLength = pwdJSON.minCapCharLength;
...
var regex = // What to do now?

我没有正则表达式制作的知识。此外,此正则表达式还将用于使用 C# 在服务器上进行验证。请推荐!

【问题讨论】:

  • 尝试将验证特殊字符和验证最小值或长度的逻辑分开(不用正则表达式更容易做到)
  • 即使我正在考虑不使用正则表达式..
  • @AvinashRaj 只认为我反刍尝试来自您的答案之一stackoverflow.com/a/25520295/1127787 它允许一个字符和一个数字..但我不知道如何使它适用于 N 字符和 N 数字
  • 我确信 Angular 以某种方式支持 ajax 回调以进行验证,因此您可以在服务器端拥有一个简单的验证函数并调用它,以它期望的形式返回 json。由于验证规则已经存在于服务器上,这似乎是最好的方法,并且可以保证您得到一致的响应。您可以将它与客户端验证(最小/最大)结合起来,然后只触发 ajax。
  • 感谢@AndrewBacker 的建议

标签: c# javascript regex


【解决方案1】:

我认为这样做可以:

^(?=(?:.*[A-Za-z].*){6})(?=(?:.*[A-Z].*){1})(?=(?:.*[0-9].*){2})(?:[a-zA-Z0-9*#$%]){8,16}$

最后输入相关限制(字母、大写、数字、最小和最大长度)以及非逗号分隔的特殊字符的位置

EDIT 使用变量添加示例...您只需将字符串构建为正则表达式模式,然后使用它进行测试

string regex = "^(?=(?:.*[A-Za-z].*){" + minCharLength + "})(?=(?:.*[A-Z].*){" + minCapCharLength + "})(?=(?:.*[0-9].*){" + minNumLength + "})(?:[a-zA-Z0-9" + specialChars + "]){" +  overallMinLength + "," + overallMaxLength + "}$"; 
bool isValid = Regex.IsMatch(password, regex);

EDIT2 - 我认为解释可能会受到赞赏 :-)

  • 我们使用^ 和$ 将正则表达式锚定到整个字符串
  • 每个测试都是正向前瞻(?= ),因此它会检查是否存在但不会移动位置
    • 测试有组 (?:.*[our_characterset].*){how_many_times} - 所以一个非捕获组有效地在字符串中的任何点(使用 .*s)搜索我们的字符正确的次数
  • 最后我们得到允许的字符(包括我们的特殊字符)必须存在于最小和最大长度出现之间(使用{m,n})(使用锚点)

而正则表达式模式只是一个字符串 - 所以我们可以使用表单中的变量来构建它..

【讨论】:

  • 所以你会有例如string regex = "^(?=(?:.*[A-Za-z].*){" + minCharLength + "})(?=(?:.*[A-Z].*){" + minCapCharLength + "})(?=(?:.*[0-9].*){" + minNumLength + "})(?:[a-zA-Z0-9" + specialChars + "]){" + overallMinLength + "," + overallMaxLength + "}$"; 然后bool isValid = Regex.IsMatch(password, regex);
  • 很好 @Captain 我以 if 和条件的形式写下来以提高可读性: if (password.match(/[a-zA-Z0-9*#\$%]{8, 16}\w*/g) && password.match(/[a-zA-Z0-9*#\$%]{8,16}\w*/g)[0].length == password.length && password.match(/[a-zA-Z]/g).length >= 6 && password.match(/[AZ]/g).length >=1 && password.match(/[0-9]/g ).length >=2) { alert("你有一个很棒的密码"); }
【解决方案2】:

通过一个正则表达式,您可以告诉用户他的密码不符合安全要求。但是,我会自行检查每个条件。这使您可以打印出更具表现力的错误消息,例如 “您的密码必须包含至少 8 个字符。” 或 “您的密码必须至少包含 2 个大写字母。” p>

可以使用string.Length 属性检查长度。

对于其他条件,您可以为每个条件定义一个字符类(括号)并计算匹配项:

  • 计数:Regex.Matches(password, "[0-9]").Count
  • 计算字母数:Regex.Matches(password, "[A-Za-z]").Count(或 Regex.Matches(password, "[\p{L}]" ).Count,如果您还想允许 ä、Ö、ß 等字母)
  • 统计大写字母:Regex.Matches(password, "[A-Z]").Count

最后一个条件(附加字符)需要一个字符类,该字符类是上述字符加上输入字段中指定的附加字符的组合:

string regex = "^[A-Za-z0-9(?#additional characters go here)]*$";
bool isValid = Regex.IsMatch(password, regex);

必须动态添加附加字符。您可以使用Regex.Escape 转义字符,例如* 或$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2012-05-30
    相关资源
    最近更新 更多