用于2个字母的正则表达式&6号

本文关键字:正则表达式 6号 2个 用于 | 更新日期: 2023-09-27 18:08:50

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

以下是应该通过的示例:

a123456b
1a2b3456
aa123456
123ab456

应该失败的样本:

1abcdefg2
a1234567b
abcdefgh
12345678

我需要一个正则表达式来满足这个规则

用于2个字母的正则表达式&6号

Edit: TL;DR: Regex不是作业的工具,作业不需要做

Regex不是问题的解决方案,而且我敢肯定,用它来解决你的问题是不可能的。(但不要相信我的话,我敢打赌有人写了一些时髦的扩展到一个深奥的Regex引擎,就是这样做的)

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

类似于(实际上没有编译这个):

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

:

正则表达式是(is?)用于根据模式检查字符串的工具。模式越简单,为它编写正则表达式就越容易。因为你希望你的密码在字符串的任何地方都有2个字符的集合,在字符串的任何地方也有6个字符的集合,所以很难(甚至不可能)创建这样的模式。

如果你的问题是"我想要密码以2个数字开始,以6个字母结束",答案将是微不足道的,但由于数字和字母可以分开,在字符串的任何地方,它不是微不足道的。

而且,大多数时候,强制密码模式并不能提高安全性。如果你必须做任何事情,强制一个合理的最小长度并停止在那里。

regex方法可以是多个,这里有2个:1)要求长度为8个字符,并使用像(?=.{8}$)这样的前瞻性,并使用消费模式,允许在字母前两次出现零个或多个数字,然后匹配零个或多个字母,2)匹配8个字母或数字,但使用前瞻性限制匹配2个字母。

示例1:

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

:

  • ^ -字符串
  • 起始
  • (?=.{8}$) -长度应该只有8个非换行符号
  • (?:'d*[a-z]){2} - 2个0+数字后跟1个字母的序列
  • 'd* - 0+数字
  • $ -字符串结束

查看regex演示

示例2:

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

:

  • ^ -字符串
  • 起始
  • (?=(?:'d*[a-z]){2}'d*$) -必须有2个0+数字和一个字母后面跟着0+数字的序列,直到字符串
  • 结束
  • ['da-z]{8} - 8位数字或字母
  • $ - end of string.

参见regex演示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;
    }