Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 2个字母的正则表达式&;6号_C#_Regex - Fatal编程技术网

C# 2个字母的正则表达式&;6号

C# 2个字母的正则表达式&;6号,c#,regex,C#,Regex,我有一个密码规则要遵循,要求密码必须包含2个字母(大写或小写)和6个数字,整个长度预计等于8个符号 以下是应通过的样本: a123456b 1a2b3456 aa123456 123ab456 以及不合格的样品: 1abcdefg2 a1234567b abcdefgh 12345678 我需要一个正则表达式来适应这个规则。编辑:TL;DR:Regex不是完成这项工作的工具,也不需要完成这项工作 Regex不是问题的解决方案,而且恐怕用它来解决问题是不可能的。(但别相信我的话,我敢打赌有人写

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

以下是应通过的样本:

a123456b
1a2b3456
aa123456
123ab456
以及不合格的样品:

1abcdefg2
a1234567b
abcdefgh
12345678

我需要一个正则表达式来适应这个规则。

编辑:TL;DR:Regex不是完成这项工作的工具,也不需要完成这项工作

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

如果可能,解决方案将无法读取。最好只是检查一下测试结果

大致如下(实际上还没有编译):

注释

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

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


而且,大多数情况下,强制使用密码模式并不会提高安全性。如果你必须做任何事情,强制执行一个合理的最小长度并停在那里。

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

    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;
    }

正则表达式方法可以是多个,这里有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+位
  • $
    -字符串结束

例2:

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

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


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

你到底在问什么?我需要一个正则表达式来验证密码为什么
a1234567b
的密码样本不正确。它包含2个字母和6个数字执行这样的规则通常对安全性有害。它常常迫使人们选择一个新的密码,然后他们必须写下来记住。最好显示一个“强度”分数,让用户选择他们想要的。@DeepakSharma看起来他想要的正好是6位数字和2个字母,好像他想要强制长度为8,是的,有很多方法可以满足要求,我需要正则表达式的原因是,如果规则在某一天发生变化,我会尝试提供灵活的正则表达式。如果需要灵活的正则表达式来计算数字和字母,可以使用变量并相应地替换6和2。对于其他规则,您需要更改正则表达式或添加另一个正则表达式。非常感谢!
^(?=(?:\d*[a-z]){2}\d*$)[\da-z]{8}$