繁体   English   中英

2 个字母和 6 个数字的正则表达式

[英]Regular expression for 2 alphabets & 6 number

我有一个密码规则要遵循,要求密码必须包含 2 个字母(大写或小写)和 6 个数字,并且整个长度预计等于 8 个符号。

以下是应该通过的样本:

a123456b
1a2b3456
aa123456
123ab456

以及应该失败的样本:

1abcdefg2
a1234567b
abcdefgh
12345678

我需要一个正则表达式来符合这个规则。

编辑:TL;DR:正则表达式不是这项工作的工具,这项工作不需要完成。

正则表达式不是问题的解决方案,AFAIK 不可能用它来解决您的问题。 (但不要相信我的话,我敢打赌有人为一个深奥的正则表达式引擎写了一些时髦的扩展,就是这样做的)

如果可能,解决方案将是不可读的。 最好只检查Count的结果。

类似的东西(实际上还没有编译这个):

bool IsPasswordValid(string pw)
{
    return pw.Length == 8 && 
            pw.Count(char.IsNumber) == 6 &&
            pw.Count(char.IsLetter) == 2;
}

注意事项

正则表达式是(是?)一种用于根据模式检查字符串的工具。 模式越简单,为它编写正则表达式就越容易。 由于您希望您的密码在字符串中的任何位置具有一组 2 个字符,并且在字符串中的任何位置也具有另一组的 6 个字符,因此创建这样的模式非常困难(甚至不可能)。

如果您的问题是“我希望密码以 2 位数字开头并以 6 个字母结尾”,那么答案将是微不足道的,但由于数字和字母可以分开并位于字符串中的任何位置,因此它并不那么微不足道。

此外,大多数情况下,强制执行密码模式并不能提高安全性。 如果您必须做任何事情,请强制执行合理的最小长度并就此停止。

正则表达式方法可以有多种,这里有 2 种:1) 需要 8 个字符的长度,并使用类似(?=.{8}$)的前瞻,并使用消费模式,允许在两次字母前有零个或多个数字,然后匹配零个或多个字母,2) 匹配 8 个字母或数字,但使用先行限制来匹配 2 个字母。

示例 1:

^(?=.{8}$)(?:\d*[a-z]){2}\d*$

详情

  • ^ - 字符串的开始
  • (?=.{8}$) - 长度只能是 8 个非换行符
  • (?:\\d*[az]){2} - 2 个 0+ 数字序列,后跟 1 个字母
  • \\d* - 0+ 位数
  • $ - 字符串的结尾。

查看正则表达式演示

示例 2:

^(?=(?:\d*[a-z]){2}\d*$)[\da-z]{8}$

详情

  • ^ - 字符串的开始
  • (?=(?:\\d*[az]){2}\\d*$) - 必须有 2 个 0+ 数字序列和一个字母后跟 0+ 数字直到字符串末尾
  • [\\da-z]{8} - 8 位数字或字母
  • $ - 字符串的结尾。

参见正则表达式演示 2

请注意,要启用不区分大小写的模式,您可以在模式前加上(?i) / RegexOptions.IgnoreCase标志,如果您只需要匹配 ASCII 数字,请使用RegexOptions.ECMAScript或将\\d替换为[0-9]

实际上,有一个很好的方法来做到这一点:

    public static bool CheckPasswordRule(string password)
    {
        var isRuleAdhered = (Regex.Matches(password, "\\d").Count == 6 && Regex.Matches(password, "[a-z]").Count == 2);

        return isRuleAdhered;
    }

如果您仍然不想一个接一个地有6位数字,您可以将代码修改为:

    public static bool CheckPasswordRule(string password)
    {
        var isRuleAdhered= false;
        isRuleAdhered = Regex.Matches(password, "\\d").Count == 6 && Regex.Matches(password, "[a-z]").Count == 2 && !Regex.IsMatch(password, "\\d{6}");
        return isRuleAdhered;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM