用于2个字母的正则表达式&6号
本文关键字:正则表达式 6号 2个 用于 | 更新日期: 2023-09-27 18:08:50
我有一个密码规则要遵循,要求密码必须包含2个字母(大写或小写)&6个数字,整个长度预计等于8个符号。
以下是应该通过的示例:
a123456b
1a2b3456
aa123456
123ab456
应该失败的样本:
1abcdefg2
a1234567b
abcdefgh
12345678
我需要一个正则表达式来满足这个规则
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;
}