想与社区确认并分享我的想法..
Active Directory密码的正则表达式应验证密码
前5个条件很简单。
我发现这应该适用于1-5个条件:
(?=^.{8,255}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))^.*
但是如何添加条件6 - 否定名称和登录?
我是这样看的:
首先得到禁止的东西:
String enter = fullname + login;
List<string> Negative = new List<string>();
for (int i = 0; i < enter.Length; i += 3)
{
if (i + 3 > enter.Length)
{
enter.Substring(i, 3);
Negative.Add(enter.Substring(i, 3));
}
}
然后构建正则表达式:
StringBuilder pattern = new StringBuilder("(?=^.{8,255}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))");
foreach(string word in Negative)
{
pattern.Append("(/^((?!" + word + @")[\s\S])*$/)");
}
pattern.Append("^.*");
该模式现在应该是所需的正则表达式。
我主要担心的是这行代码:
pattern.Append("(/^((?!" + word + @")[\s\S])*$/)");
它会为word
添加否定条件吗?
答案 0 :(得分:2)
正则表达式是一个很好的工具,但不能解决所有问题。例如,正则表达式在您需要的意义上不计算在内。是的,正则表达式可以计算,例如连续的字母,但它不能检查你,例如有两个这样的和三个其他的,分布在完整的输入字符串上。这也适用于您的具体问题。具体来说,在同一正则表达式中检查这两个不同的条件可能会变得非常困难。
在这种情况下,我建议不要使用正则表达式,只需编写一个执行所有检查的小算法。使用这种方法可以获得的另一个好处是,凡人在以后重新访问它时都能理解你的算法。永远是一个额外的好处。
答案 1 :(得分:0)
您的第5和第1个要求将导致此正则表达式
^.{6,}$
对于您的第6项要求,
考虑到您的帐户名称为accountName
input
是您的目标输入密码
bool isNotValid= Regex.Matches(accountName,"(?=(..))")//capturing two consecutive characters of account name
.Cast<Match>()
.Select(m=>m.Groups[1].Value)//two consecutive character's list
.Any(y=>input.IndexOf(y)!=-1);
捕获两个连续字符与捕获两个以上连续字符一样好
我使用(?=(..))
来捕获两个连续的字符。这样可以从hello捕获he
,el
,ll
,lo
。