我有一个密码规则要遵循,要求密码必须包含2个字母(大写或小写)& 6个数字,预计整个长度等于8个符号。
这是应该通过的样本:
a123456b
1a2b3456
aa123456
123ab456
应该失败的样本:
1abcdefg2
a1234567b
abcdefgh
12345678
我需要一个正则表达式来适应这个规则。
答案 0 :(得分:3)
编辑: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个字母结尾”,那么答案将是微不足道的,但由于数字和字母可以分开并且在字符串中的任何位置,因此它不是琐碎的。
此外,大多数情况下,强制执行密码模式并不会增加安全性。如果你必须做任何事情,强制执行一个理智的最小长度,并在那里停止。
答案 1 :(得分:1)
正则表达式方法可以是多个,这里是2:1)需要8个字符的legnth与前瞻类似(?=.{8}$)
并使用消费模式允许在字母前两次或更多位数,然后匹配零或更多字母,2)匹配8个字母或数字,但使用超前限制来匹配2个字母。
示例1:
^(?=.{8}$)(?:\d*[a-z]){2}\d*$
详细:
^
- 字符串开头(?=.{8}$)
- 长度应仅为8个非换行符号(?:\d*[a-z]){2}
- 2个0+位的序列,后跟1个字母\d*
- 0+位数$
- 字符串结束。请参阅regex demo
示例2:
^(?=(?:\d*[a-z]){2}\d*$)[\da-z]{8}$
详细:
^
- 字符串开头(?=(?:\d*[a-z]){2}\d*$)
- 必须有2个0+位数序列和一个字母后跟0+位数到字符串末尾[\da-z]{8}
- 8个数字或字母$
- 字符串结束。请参阅regex demo 2
注意要启用不区分大小写的模式,可以在模式前加上(?i)
/ RegexOptions.IgnoreCase
标志,如果只需要匹配ASCII数字,请使用{{ 1}}或将RegexOptions.ECMAScript
替换为\d
。
答案 2 :(得分:0)
实际上,有一种很好的方法可以做到:
如果您仍然希望一个接一个地不具有6位数字,则可以将代码修改为:
public static bool CheckPasswordRule(string password)
{
var isRuleAdhered = (Regex.Matches(password, "\\d").Count == 6 && Regex.Matches(password, "[a-z]").Count == 2);
return isRuleAdhered;
}