我必须为指定为:
的密码提供数据注释正则表达式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环境)
答案 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]
(在两种方法中)。但我不确定这是否会使事情变得更具可读性。