正则表达我的密码验证

时间:2012-03-09 13:53:12

标签: c# regex validation passwords

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

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

问题是我总是假装回来。

5 个答案:

答案 0 :(得分:3)

!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;
}

答案 1 :(得分:2)

您忘了添加'+'进行一次或多次匹配:

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

答案 2 :(得分:1)

此代码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}$");

答案 3 :(得分:1)

你有两个问题。首先和$需要被转义。其次,你只匹配1个字符。在最后一个$:

之前添加一个+
^[a-z0-9\.@#\$%&]+$

编辑:另一个建议,如果您有最小/最大长度,您可以将+替换为{6,16}或您认为合适的任何内容。这将匹配6到16个字符的字符串,并拒绝任何更短或更长的字符串。如果您不关心上限,可以使用{6,}。

答案 4 :(得分:0)

在使用正则表达式转义序列时,您是否尝试过使用逐字字符串文字?

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

您的模式只允许单character setrepetition operator,例如* +{10,}

你的character set包括.,它匹配任何角色,击败角色类的对象。如果您想匹配".",则需要使用\.

进行转义