我的客户要求他们的系统上的密码必须遵循一组特定的验证规则,并且我很难想出一个"漂亮"的正则表达式.
我给出的规则是......
当我按下更多时,"特殊字符"几乎就是其他所有内容(包括空格).
我可以使用以下内容轻松检查所有四个实例中的至少一个实例...
^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?\d)(?=.*?[^a-zA-Z0-9]).{8,}$
Run Code Online (Sandbox Code Playgroud)
以下作品,但它太可怕而且凌乱......
^((?=.*?[A-Z])(?=.*?[a-z])(?=.*?\d)|(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[^a-zA-Z0-9])|(?=.*?[A-Z])(?=.*?\d)(?=.*?[^a-zA-Z0-9])|(?=.*?[a-z])(?=.*?\d)(?=.*?[^a-zA-Z0-9])).{8,}$
Run Code Online (Sandbox Code Playgroud)
所以你不必自己解决,上面是检查(1,2,3|1,2,4|1,3,4|2,3,4)4组的4种可能组合(其中数字与规则集中的"类型"相关).
这样做有"更好",更清洁或更简单的方法吗?
(请注意,这将用于<asp:RegularExpressionValidator>ASP.NET网站中的控件,因此需要成为.NET和javascript的有效正则表达式.)
Dan*_*nez 18
这不是一个更好的解决方案,但你可以减少[^a-zA-Z0-9]到[\W_],因为单词字符是所有字母,数字和下划线字符.在单个正则表达式中尝试执行此操作时,我认为您不能避免交替.我认为你几乎拥有最好的解决方案.
一个轻微的优化是\d*[a-z]\w_*|\d*[A-Z]\w_*〜> \d*[a-zA-Z]\w_*,所以我可以删除其中一个交替集.如果你只允许4个中的3个这不起作用,但是因为\d*[A-Z][a-z]\w_*被隐含地允许它起作用.
(?=.{8,})((?=.*\d)(?=.*[a-z])(?=.*[A-Z])|(?=.*\d)(?=.*[a-zA-Z])(?=.*[\W_])|(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_])).*
Run Code Online (Sandbox Code Playgroud)
扩大的视野:
(?=.{8,})(
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])|
(?=.*\d)(?=.*[a-zA-Z])(?=.*[\W_])|
(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_])
).*
Run Code Online (Sandbox Code Playgroud)
由于OP指定的第四个条件,此正则表达式将匹配甚至不可打印的字符,例如新行.如果这是不可接受的,则修改包含的集合\W以允许更具体的特殊字符集.