我必须为指定为密码的数据注释正则表达式:
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 环境)
最佳答案
如果你真的想在一个正则表达式模式中做到这一点:
^(?=.*[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]
(在这两种方法中)。但我不确定这是否会增加或减少可读性。
关于.net - 具有某些特殊字符的密码的正则表达式,不包括所有其他字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16114882/