密码的按需正则表达式

时间:2014-08-27 06:54:50

标签: c# javascript regex

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

enter image description here

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

但是我需要生成一个正则表达式,它将通过从db中获取的参数动态创建。

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

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

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

2 个答案:

答案 0 :(得分:1)

我认为这样做会:

^(?=(?:.*[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})(使用锚点)

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

答案 1 :(得分:0)

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

可以使用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来转发*$

等字符