Regex用于我的密码验证

本文关键字:验证 密码 我的 用于 Regex | 更新日期: 2023-09-27 18:27:19

我的密码格式需要一个正则表达式。它必须确保密码只包含字母a-z、数字0-9和特殊字符:.@#$%&。我使用的是.NET C#编程语言。这是我的代码:

Regex userAndPassPattern = new Regex("^[a-z0-9.@#$%&]$");
if (!userAndPassPattern.IsMatch(username) || !userAndPassPattern.IsMatch(password))
    return false;

问题是我总是得到错误的回复。

Regex用于我的密码验证

!A || !B在逻辑上等价于!(A && B)

所以你可以写更好的

!(userAndPassPattern.IsMatch(username) && userAndPassPattern.IsMatch(password))

那么你的角色类中有一个特殊的角色$,也许你需要屏蔽它'$
我对此不太确定,因为在角色类中,它不是一个特殊的角色。也许这取决于使用中的RegEx引擎。如果你屏蔽$,它应该不会造成伤害([a-z0-9.@#'$%&]

那么你只有一个字符可以匹配。你需要一个量词

[a-z0-9.@#$%&]表示给定字符中的一个字符,将与ab0匹配,但与ab不匹配
[a-z0-9.@#$%&]+给定字符中的许多字符,从1到无尽的出现,将与ababba等匹配。

编辑

这就是你想要的

Regex userAndPassPattern = new Regex("^[a-z0-9'.@#'$%&]+$");
if (!(userAndPassPattern.IsMatch(username) && userAndPassPattern.IsMatch(password))) {
    return false;
}

您忘记添加一次或多次匹配的"+":

  Regex userAndPassPattern = new Regex("^[a-z0-9.@#$%&]+$");

此代码Regex userAndPassPattern = new Regex("^[a-z0-9.@#$%&]$");将只匹配一个字符长的用户名或密码。

您正在寻找类似这样的Regex userAndPassPattern = new Regex("^[a-z0-9.@#$%&]+$");,它将与您的类中的一个或多个字符相匹配。+符号告诉它匹配一个或多个前一个原子(在本例中是在方括号中指定的字符类)

此外,如果您无意将匹配限制为小写字符,则应将"A-Z"添加到字符类Regex userAndPassPattern = new Regex("^[A-Za-z0-9.@#$%&]$");

您可能还想要实现最小长度限制,这可以通过用{n,}构造替换+来实现,其中n是您想要匹配的最小长度。例如:

这将匹配至少6个字符的

Regex userAndPassPattern = new Regex("^[a-z0-9.@#$%&]{6,}$");

这将匹配最小值为6和最大值为12的

Regex userAndPassPattern = new Regex("^[a-z0-9.@#$%&]{6,12}$");

您有两个问题。第一和美元需要逃脱。其次,您只匹配了一个字符。在最后一个$:之前添加一个+

^[a-z0-9'.@#'$%&]+$

编辑:另一个建议是,如果你有一个最小/最大长度,你可以用{6,16}或你认为合适的任何词来代替+。这将匹配包含6到16个字符的字符串,并拒绝任何更短或更长的字符串。如果你不在乎上限,你可以使用{6,}。

在使用regex转义序列时,您是否尝试过使用逐字逐句的字符串文字?

Regex userAndPassPattern = new Regex(@"^[a-z0-9@#'$%&]+$");
if (!userAndPassPattern.IsMatch(username) || !userAndPassPattern.IsMatch(password))
    return false;

您的模式只允许一个字符集,您可能想要一个类似*+{10,}的重复运算符。

您的角色集包括.,它匹配任何角色,击败了角色类的对象。如果您想匹配".",则需要使用'. 进行转义