正则表达式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,}$

正则表达式c#密码删除空格

问题不在于格式中的空格,问题在于允许.{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);

只需匹配所需类的一个字符,然后使用MatchCollectioncount()方法获得这些字符的数量。

我在这里使用了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就不"好"了。