我有一个很好的正则表达式构建器,如下所示:
string numberOfDigits = "2";
string numberOfCaps = "2";
string numberOfChars = "3";
string numberOfNonAlpha = "3";
string minLength = "10";
string rexExString = "^(?=.*\\d{" + numberOfDigits + "})(?=.*[A-Z]{" + numberOfCaps + "})(?=.*[a-z]{" + numberOfChars + "})(?=.*[!@#$%^&*()]{" + numberOfNonAlpha + "}).{" + minLength + ",}$";
输出将是:
^(?=.*\d{2})(?=.*[A-Z]{2})(?=.*[a-z]{3})(?=.*[!@#$%^&*()]{3}).{10,}$
这样我可以指定我想要的密码数字,字符,非字母等。我想保持这种方式。唯一的问题是它也接受空格,我不希望这是我的密码。
我的问题
如何不在我的正则表达式中允许空格,但保留格式,以便我可以像上面的示例中那样指定变量。
^(?=.*\d{2})(?=.*[A-Z]{2})(?=.*[a-z]{3})(?=.*[!@#$%^&*()]{3}).{10,}$
答案 0 :(得分:1)
最后,您可以指定至少应包含10个非空格字符.{10,}$
,而不是最后使用\S{10,}$
。
\S{" + minLength + ",}$
注意大写的S。
答案 1 :(得分:1)
问题不在于您格式中的空格问题是您允许最后使用.{10,}
的所有字符。
试试这个
\S{10,}
\S
不是空格(与[^\s]
相同)
顺便说一下。你知道你想要在(?=.*\d{2})
的序列中有两位数而不是两位数吗?这意味着不会接受Foo1bar2。
如何简化此操作?
将所有要求放入一个正则表达式有点困难。特别是如果您希望允许在密码之间分配可配置数量的数字而不是按顺序分配。
为什么不稍微分开这个验证过程。
您可以首先检查^\S{10,}$
以确保密码中至少有10个非空白字符。
然后你可以计算字符的类型,例如像这样:
MatchCollection uppercase = Regex.Matches(s, @"\p{Lu}");
MatchCollection lowercase = Regex.Matches(s, @"\p{Ll}");
MatchCollection digits = Regex.Matches(s, @"\p{N}");
MatchCollection nonAlpha = Regex.Matches(s, @"[\p{N}\p{L}]");
Console.WriteLine("Upper: " + uppercase.Count);
Console.WriteLine("Lower: " + lowercase.Count);
Console.WriteLine("Digits: " + digits.Count);
Console.WriteLine("NonAlpha: " + nonAlpha.Count);
只需匹配所需课程的一个字符,然后使用count()
的{{1}}方法获取这些字符的数量。
我在这里使用了Unicode属性(MatchCollection
),您可以轻松地将其更改为您想要的角色类。这是overview over the Unicode properties on regular-expressions.info
然后,您可以获取每种字符类型的数量,并将其与特定类型所需的数字进行比较。
这将是一个更易读和可维护的功能。
答案 2 :(得分:1)
Regex rx = new Regex(@"^((?<N>[0-9])|(?<CU>[A-Z])|(?<CL>[a-z])|(?<NA>[!@#$%&*()^])| )*$(?<-N>){3}(?<-CU>){1}(?<-CL>){2}(?<-NA>){4}");
此正则表达式使用平衡组来“累积”各种类型的字符。它将拒绝不在(那些组加空间)中的字符。因此,例如è
将被拒绝。如果您想更改它,请将| )
替换为|.)
在字符串($
)的末尾,它检查所有各种“堆栈”中是否有足够的字符。显然,在{3}, {1}, {2}, {4}
您需要输入数字的位置。
请注意,此正则表达式的有趣之处在于它适用于1!A!a!2!b3
。如果你希望各种类型的字符是连续的(所以123Abc!!!!
),那么这个正则表达式不是“好”。