我需要为密码创建一个正则表达式,其强度设置可以由客户端更改。强度参数如下:
最小和最大长度可以由 AngularJS ngMinlength 和 ngMaxlength 处理。
但是我需要生成一个正则表达式,该表达式将通过从数据库获取的参数动态创建。
我可以像这样从 JSON 中获取这些参数:
var minCharLength = pwdJSON.minCharLength;
var minCapCharLength = pwdJSON.minCapCharLength;
...
var regex = // What to do now?
我没有正则表达式制作的知识。另外,此正则表达式还将用于使用 C# 在服务器上进行验证。
最佳答案
我认为这样可以做到:
^(?=(?:.*[A-Za-z].*){6})(?=(?:.*[A-Z].*){1})(?=(?:.*[0-9].*){2})(?:[a-zA-Z0-9*#$%]){8,16}$
在末尾添加相关限制(字母、大写字母、数字、最小和最大长度)以及非逗号分隔的特殊字符
编辑添加带有变量的示例...您只需将字符串构建为正则表达式模式,然后用它进行测试
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}
)(带有 anchor )
正则表达式模式只是一个字符串 - 所以我们可以使用表单中的变量来构建它..
关于c# - 密码的按需正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25520667/