我的客户要求他们系统上的密码必须遵循一组特定的验证规则,我很难想出一个“漂亮”的正则表达式。
我得到的规则是......
当我按下更多键时,“特殊字符”实际上就是其他所有内容(包括空格)。
我可以使用以下方法轻松检查所有四个实例中的至少一个实例...
^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?\d)(?=.*?[^a-zA-Z0-9]).{8,}$
以下工作,但它是可怕的和凌乱的......
^((?=.*?[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,}$
所以你不必自己解决,上面是检查
(1,2,3|1,2,4|1,3,4|2,3,4)
这是 4 个组的 4 种可能组合(其中数字与规则集中的“类型”有关)。有没有“更好”,更清洁或更简单的方法来做到这一点?
(请注意,这将用于 ASP.NET 网站的
<asp:RegularExpressionValidator>
控件中,因此需要是 .NET 和 javascript 的有效正则表达式。)
最佳答案
这不是更好的解决方案,但您可以减少 [^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_])).*
扩展版:
(?=.{8,})(
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])|
(?=.*\d)(?=.*[a-zA-Z])(?=.*[\W_])|
(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_])
).*
由于 OP 指定的第四个条件,此正则表达式甚至会匹配不可打印的字符,例如换行符。如果这是 Not Acceptable ,则修改包含
\W
的集合。以允许更具体的特殊字符集。
关于正则表达式查找 4 个条件中的 3 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22204836/