【发布时间】:2014-04-07 22:17:51
【问题描述】:
我的客户要求他们系统上的密码必须遵循一组特定的验证规则,但我很难想出一个“好的”正则表达式。
给我的规则是……
- 最少 8 个字符
- 允许任何字符
- 必须至少有一个实例来自以下四种字符类型中的三种...
- 大写字符
- 小写字符
- 数字
- “特殊字符”
当我按下更多时,“特殊字符”实际上就是其他所有内容(包括空格)。
我可以使用以下命令轻松检查所有四个实例中的至少一个...
^(?=.*?[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 的有效正则表达式。)
【问题讨论】:
-
我不认为有一个“好的”单次模式可以做到这一点。最好的方法是将计数器变量设置为零并通过四个单独的测试将其递增。您可以使用正则表达式或内置函数(如果可用)执行这些测试(我不知道 asp)
-
我明白你在说什么@Casimiret,但这需要多个正则表达式和额外的自定义处理才能解决。不幸的是,这需要是一个单一的模式,因为它是一个“配置”,它将在网站的几个不同部分驱动
<asp:RegularExpressionValidator>控件。 -
如果您有可能避免,对于这种类型的数据,RegularExpressionValidator 并找到其他方法来做到这一点,不要犹豫。请记住,简单的
(?=.*[a-z])在性能方面很差,将其乘以 12... -
最好的方法是使用
<asp:CustomValidator>并编写自己的函数。 -
这应该是正确答案:stackoverflow.com/a/5951154/1497565