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

标签 regex passwords

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

我得到的规则是......

  • 最少 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 的有效正则表达式。)

    最佳答案

    这不是更好的解决方案,但您可以减少 [^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/

    相关文章:

    Python:If 语句 "If not none"处理

    c++ - 用C++和MySQL实现登录系统

    php - mysql登录用户名密码

    ruby-on-rails - Capistrano 3 部署要求输入 SSH 密码,但无法输入

    regex - 用正则表达式语法解释大括号

    regex - vscode 正则表达式子匹配评估而不是连接?

    字符串中的动态重复序列需要 Java 正则表达式

    mysql - 仅使用 root 密码访问 MySQL 数据库

    c# - 延迟时间密码的最佳方法?

    java - 正则表达式模式匹配