密码的正则表达式,某些特殊字符不包括所有其他字符

时间:2013-04-19 23:27:51

标签: .net regex

我必须为指定为:

的密码提供数据注释正则表达式
min 8 chars
min 1 upper
min 1 lower
min 1 numeric
min 1 special char which can ONLY be one of the following:$|~=[]'_-+@. (and the password can contain no other special chars besides these)

排除特殊角色让我头疼。

我想出了这个,但它不起作用:

"^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[\d])**(?(?!.*[^$|~=[\]'_\-+@.])|([^\W\w])).*$**

它将我输入的所有内容都解析为无效。

然而(对于特殊字符)本身确实有效:

"(?(?!.*[^$|~=[\]'_\-+@.])|([^\W\w])).*$"

我知道第一部分有效,所以我错过了让它们一起工作的原因吗?

或者,是否有更简单的方法来实现这一目标?

(。NET环境)

1 个答案:

答案 0 :(得分:3)

如果你真的想以一种正则表达式模式做到这一点:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$|~=[\]'_+@.-])[a-zA-Z0-9$|~=[\]'_+@.-]{8,}$

这应该可以解决问题。我们要求,小写字母,大写字母,数字和符号与前瞻。请注意,在字符类中,您需要将-移到最后或将其转义。否则,它会创建一个您不想要的字符范围。然后我们使用常规匹配来确保只有允许的字符,并且至少有8个字符。

然而,进行多项测试通常是一种更好的方法。单独运行这些模式:

[a-z]                     // does the input contain a lower case letter?
[A-Z]                     // does the input contain an upper case letter?
\d                        // does the input contain a digit?
[$|~=[\]'_+@.-]           // does the input contain one of the required symbols?
[^a-zA-Z0-9$|~=[\]'_+@.-] // are there invalid characters?

其中前4个应返回true,最后一个应返回false。此外,您还可以查看input.Length >= 8。这使代码更具可读性,并允许您发出关于 条件未得到满足的相应错误消息。

事实上,由于最后一个模式确保只有所需的字符,我们可以简化“{必须有一个符号条件”到[^a-zA-Z0-9](在两种方法中)。但我不确定这是否会使事情变得更具可读性。