3

我必须为指定为的密码提供数据注释正则表达式:

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 环境)

4

1 回答 1

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](在两种方法中)。但我不确定这是否会使事情更具可读性。

于 2013-04-19T23:47:10.443 回答