正则表达式找到4个条件中的3个

fre*_*ler 20 regex passwords

我的客户要求他们的系统上的密码必须遵循一组特定的验证规则,并且我很难想出一个"漂亮"的正则表达式.

我给出的规则是......

  • 最少8个字符
  • 允许任何角色
  • 必须至少有一个来自以下四种字符类型中的三种的实例...
    1. 大写字母
    2. 小写字符
    3. 数字数字
    4. "特殊字符"

当我按下更多时,"特殊字符"几乎就是其他所有内容(包括空格).

我可以使用以下内容轻松检查所有四个实例中的至少一个实例...

^(?=.*?[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以允许更具体的特殊字符集.