正则表达式c#密码删除空格
本文关键字:空格 码删除 密码 正则表达式 | 更新日期: 2023-09-27 18:12:39
我有一个很好的正则表达式生成器,如下所示:
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,}$
问题不在于格式中的空格,问题在于允许.{10,}
结尾的所有字符。
试试这个
'S{10,}
'S
不是空白(与[^'s]
相同(
Btw。你知道吗,你想在(?=.*'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);
只需匹配所需类的一个字符,然后使用MatchCollection
的count()
方法获得这些字符的数量。
我在这里使用了Unicode属性('p{...}
(,您可以很容易地将其更改为所需的字符类。以下是regular-expressions.info 上Unicode属性的概述
然后,您可以获得每个字符类型的数量,并将其与特定类型所需的数量进行比较。
这将是一个可读性和可维护性更强的函数。
您可以指定至少有10个非空格字符'S{10,}$
,而不是最终使用.{10,}$
。
'S{" + minLength + ",}$
注意大写字母S.
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}
的地方,你必须把你的号码放在那里。
注意,这个Regex的有趣之处在于它将适用于1!A!a!2!b3
。如果你希望各种类型的字符是连续的(所以123Abc!!!!
(,那么这个Regex就不"好"了。